2010-05-27 8 views
5

Hej tam. Mam aplikację C#, która analizuje pliki txt i importuje z nich dane do bazy danych sql db. Używałem sqlite i teraz pracuję nad przeniesieniem go do serwera sql. To działało dobrze z sqlite, ale teraz z sql otrzymuję błąd podczas przetwarzania plików. Dodał pierwszy wiersz danych do bazy danych, a następnie powiedział: "Parametr @ Numerarty został już zadeklarowany. Nazwy zmiennych muszą być unikalne w ramach procedury wsadowej lub składowanej". Oto mój cały układ i kod SQL stół ... błąd pojawia się w ostatniej insertCommand.ExecuteNonQuery() przykład na końcu kodu ...Błąd SQL C# - Parametr już zdefiniowany

SQL TABELA:

CREATE TABLE Import (
    RowId int PRIMARY KEY IDENTITY, 
    PartNumber text, 
    CMMNumber text, 
    Date text, 
    FeatType text, 
    FeatName text, 
    Value text, 
    Actual text, 
    Nominal text, 
    Dev text, 
    TolMin text, 
    TolPlus text, 
    OutOfTol text, 
    FileName text 
); 

KOD:

using System; 
using System.Data; 
using System.Data.SQLite; 
using System.IO; 
using System.Text.RegularExpressions; 
using System.Threading; 
using System.Collections.Generic; 
using System.Linq; 
using System.Data.SqlClient; 


namespace JohnDeereCMMDataParser 
{ 
    internal class Program 
    { 


     public static List<string> GetImportedFileList() 
     { 
      List<string> ImportedFiles = new List<string>(); 
      using (SqlConnection connect = new SqlConnection(@"Server=FRXSQLDEV;Database=RX_CMMData;Integrated Security=YES")) 
      { 
       connect.Open(); 
       using (SqlCommand fmd = connect.CreateCommand()) 
       { 

        fmd.CommandText = @"IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'RX_CMMData' AND TABLE_NAME = 'Import')) BEGIN SELECT DISTINCT FileName FROM Import; END"; 
        fmd.CommandType = CommandType.Text; 
        SqlDataReader r = fmd.ExecuteReader(); 
        while (r.Read()) 
        { 
         ImportedFiles.Add(Convert.ToString(r["FileName"])); 

        } 
       } 
      } 
      return ImportedFiles; 
     } 




     private static void Main(string[] args) 
     { 


      Console.Title = "John Deere CMM Data Parser"; 
      Console.WriteLine("Preparing CMM Data Parser... done"); 
      Console.WriteLine("Scanning for new CMM data... done"); 
      Console.ForegroundColor = ConsoleColor.Gray; 

      using (SqlConnection con = new SqlConnection(@"Server=FRXSQLDEV;Database=RX_CMMData;Integrated Security=YES")) 
      { 

       con.Open(); 

       using (SqlCommand insertCommand = con.CreateCommand()) 
       { 

        SqlCommand cmdd = con.CreateCommand(); 
        string[] files = Directory.GetFiles(@"C:\Documents and Settings\js91162\Desktop\ ", "R303717*.txt*", SearchOption.AllDirectories); 



         List<string> ImportedFiles = GetImportedFileList(); 

         foreach (string file in files.Except(ImportedFiles)) 


         { 

          string FileNameExt1 = Path.GetFileName(file); 


          cmdd.CommandText = 
           @" 
        IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'RX_CMMData' AND TABLE_NAME = 'Import')) BEGIN SELECT COUNT(*) FROM Import WHERE FileName = @FileExt; END"; 
          cmdd.Parameters.Add(new SqlParameter("@FileExt", FileNameExt1)); 

          int count = Convert.ToInt32(cmdd.ExecuteScalar()); 
          con.Close(); 
          con.Open(); 

          if (count == 0) 
          { 
           Console.WriteLine("Parsing CMM data for SQL database... Please wait."); 


           insertCommand.CommandText = 
            @" 
        INSERT INTO Import (FeatType, FeatName, Value, Actual, Nominal, Dev, TolMin, TolPlus, OutOfTol, PartNumber, CMMNumber, Date, FileName) 
        VALUES  (@FeatType, @FeatName, @Value, @Actual, @Nominal, @Dev, @TolMin, @TolPlus, @OutOfTol, @PartNumber, @CMMNumber, @Date, @FileName);"; 

           insertCommand.Parameters.Add(new SqlParameter("@FeatType", DbType.Decimal)); 
           insertCommand.Parameters.Add(new SqlParameter("@FeatName", DbType.Decimal)); 
           insertCommand.Parameters.Add(new SqlParameter("@Value", DbType.Decimal)); 
           insertCommand.Parameters.Add(new SqlParameter("@Actual", DbType.Decimal)); 
           insertCommand.Parameters.Add(new SqlParameter("@Nominal", DbType.Decimal)); 
           insertCommand.Parameters.Add(new SqlParameter("@Dev", DbType.Decimal)); 
           insertCommand.Parameters.Add(new SqlParameter("@TolMin", DbType.Decimal)); 
           insertCommand.Parameters.Add(new SqlParameter("@TolPlus", DbType.Decimal)); 
           insertCommand.Parameters.Add(new SqlParameter("@OutOfTol", DbType.Decimal)); 





           string FileNameExt = Path.GetFullPath(file); 
           string RNumber = Path.GetFileNameWithoutExtension(file); 

           string RNumberE = RNumber.Split('_')[0]; 

           string RNumberD = RNumber.Split('_')[1]; 
           string RNumberDate = RNumber.Split('_')[2]; 

           DateTime dateTime = DateTime.ParseExact(RNumberDate, "yyyyMMdd", Thread.CurrentThread.CurrentCulture); 
           string cmmDate = dateTime.ToString("dd-MMM-yyyy"); 
           string[] lines = File.ReadAllLines(file); 
           bool parse = false; 

           foreach (string tmpLine in lines) 
           { 


            string line = tmpLine.Trim(); 
            if (!parse && line.StartsWith("Feat. Type,")) 
            { 
             parse = true; 
             continue; 
            } 
            if (!parse || string.IsNullOrEmpty(line)) 
            { 
             continue; 
            } 

            Console.WriteLine(tmpLine); 
            foreach (SqlParameter parameter in insertCommand.Parameters) 
            { 
             parameter.Value = null; 
            } 

            string[] values = line.Split(new[] { ',' }); 

            for (int i = 0; i < values.Length - 1; i++) 
            { 
             SqlParameter param = insertCommand.Parameters[i]; 
             if (param.DbType == DbType.Decimal) 
             { 
              decimal value; 
              param.Value = decimal.TryParse(values[i], out value) ? value : 0; 
             } 
             else 
             { 
              param.Value = values[i]; 
             } 
            } 

            insertCommand.Parameters.Add(new SqlParameter("@PartNumber", RNumberE)); 
            insertCommand.Parameters.Add(new SqlParameter("@CMMNumber", RNumberD)); 
            insertCommand.Parameters.Add(new SqlParameter("@Date", cmmDate)); 
            insertCommand.Parameters.Add(new SqlParameter("@FileName", FileNameExt)); 
            // 
            insertCommand.ExecuteNonQuery(); 

           } 


          } 

         } 
         Console.WriteLine("CMM data successfully imported to SQL database..."); 

        } 
        con.Close(); 

      } 
     } 
    } 
} 

Odpowiedz

11

Spróbuj oświadczenie na początku pętli foreach:

insertCommand.Parameters.Clear(); 
2

Po raz drugi w pętli, spróbujesz ponownie dodać parametry do swojej inserCommand, ale insertCommand jest już utworzony i zawiera te parametry.

Spróbuj dodać wszystkie parametry przed pętlą, a następnie przypisz wartość w pętli.

5

Tworzysz zmienną insertCommand raz i używasz jej za każdym razem wokół pętli, ale dodajesz do niej również te same parametry za każdym razem wokół pętli. Z tego powodu po drugim uruchomieniu pętli pojawia się zduplikowany błąd parametru.

albo:

  • dodawać parametry raz na zewnątrz pętli, utrzymując odniesienie do nich, a następnie ustawienie ich wartości za każdym razem przez pętlę.
  • zadzwoń pod numer insertCommand.Parameters.Clear() na początku pętli.

Pierwsza opcja jest lepsza, ponieważ jest bardziej wydajna przy tworzeniu obiektu.

+0

Nie nazywaj clear(), istnieją pewne parametry, które są wymienione raz, przed pętlą - nie chce usunąć tych zbyt. – Blorgbeard

+0

Która pętla? pętla foreach (pliki w files.Except ...)? –

+0

@jakesankey: Tak, ta pętla :) – Thorarin

Powiązane problemy