SQL错误C# - 已定义的参数

Jak*_*key 6 c# sql

嘿.我有一个ac#application解析txt文件并将数据从它们导入到sql db中.我正在使用sqlite,现在我正在将它移植到sql server.它与sqlite工作正常但现在使用sql我正在处理文件时出错.它补充数据到数据库的第一行,然后说"参数@PartNumber已声明.变量名必须是一个批处理或存储过程中是唯一的." 这是我的整个代码和SQL表格布局......错误来自insertCommand.ExecuteNonQuery()代码末尾的最后一个实例......

SQL TABLE:

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   
);
Run Code Online (Sandbox Code Playgroud)

码:

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();

            }
        } 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

Sim*_*ick 13

在foreach循环开始时尝试此语句:

insertCommand.Parameters.Clear();
Run Code Online (Sandbox Code Playgroud)


adr*_*nks 5

您正在创建insertCommand一次变量并且每次循环时重复使用它,但每次循环时您也要为它添加相同的参数.这就是为什么第二次绕循环时会出现重复参数错误的原因.

或者:

  • 在循环外部添加一次参数,保持对它们的引用,然后每次循环设置它们的值.
  • insertCommand.Parameters.Clear()在循环开始时调用.

第一个选项更好,因为它在创建对象时更有效.