为什么会出现此错误?如何处理空值。 Message=必须指定附加参数

Why am I getting this error? How to handle Null Values. Message=Must specify additional parameters

所以我正在写一个数据导出,在 SQL 和 Foxpro 之间,我使用参数化字符串来提取必要的数据,我还使用字符串连接来获取请求的信息某些记录,这似乎工作正常,直到我到达排序代码记录,其中规定的错误变得普遍。

作为简要说明。建立与两个数据库的连接。

static void Main(string[] args)
    {
        using (var exportConnection = new SqlConnection(connectionString: "Data Source=Localhost;"
                                                                          + "Trusted_Connection=yes;"
                                                                          + @"connection timeout=30;"
                                                                          + @"database=001-CARL_V4"))
        using (var importConnection = new OleDbConnection(connectionString: @"Provider=vfpoledb.1;"
                                                                            +
                                                                            @"data source=C:\Users\Joshua.cameron\Desktop\PCHomesImportTestBlank\PCHomesServer\DATABASE\pchomes.dbc")
            )

我正在设置从 SQL 到 select 的命令:

            using (SqlCommand exportCommand = new SqlCommand(@"select 
    [ID]
    ,[OwTitle]
    ,[OwForenames]
    ,[OwSurname]      
    ,[OwNum]
    ,[OwAddress1]
    ,[OwAddress2]
    ,[OwAddress3]
    ,[OwAddress4]
    ,[OwPostcode]
    ,[OwPhHome]
    ,[OwPhWork]
    ,[OwPhFax]
    ,[OwPhMobile]
    ,[OwEMail]
    ,[OwBankName]
    ,[OwAccNo]
    ,[OwAccName]
    ,[OwSalutation]
    ,[OwNotes]
    ,[OwSort1]
    ,[OwSort2]
    ,[OwSort3]

来自 dbo.CARL_Owners", exportConnection))

以及插入到 VFP 中的命令:

using (OleDbCommand importCommand = new OleDbCommand(@"INSERT INTO CLIENT 
    (CLCODE
    ,clcodedesc
    ,Title
    ,Fname
    ,Sname
    ,Address1
    ,Address3
    ,Address5
    ,Address4
    ,Address6
    ,Postcode
    ,Phoneh
    ,PhoneW
    ,Facsimileh
    ,Mobile
    ,Emailaddr
    ,Bankname
    ,Bankacno
    ,Bankacna
    ,Salute
    ,Notes
    ,BANKSORT
    ) 
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
            importConnection))

将参数化值添加到上述 INSERT 语句中:

importCommand.Parameters.AddWithValue("clcode", "");
            importCommand.Parameters.AddWithValue("clcodedesc", "");
            importCommand.Parameters.AddWithValue("Title", "");
            importCommand.Parameters.AddWithValue("Fname", "");
            importCommand.Parameters.AddWithValue("Sname", "");
            importCommand.Parameters.AddWithValue("Address1", "");
            importCommand.Parameters.AddWithValue("Address3", "");
            importCommand.Parameters.AddWithValue("Address5", "");
            importCommand.Parameters.AddWithValue("Address4", "");
            importCommand.Parameters.AddWithValue("Address6", "");
            importCommand.Parameters.AddWithValue("Postcode", "");
            importCommand.Parameters.AddWithValue("Phoneh", "");
            importCommand.Parameters.AddWithValue("PhoneW", "");
            importCommand.Parameters.AddWithValue("Facsimileh", "");
            importCommand.Parameters.AddWithValue("Mobile", "");
            importCommand.Parameters.AddWithValue("Emailaddr", "");
            importCommand.Parameters.AddWithValue("Bankname", "");
            importCommand.Parameters.AddWithValue("Bankacno", "");
            importCommand.Parameters.AddWithValue("Bankacna", "");
            importCommand.Parameters.AddWithValue("Salute", "");
            importCommand.Parameters.AddWithValue("Notes", "");
            importCommand.Parameters.AddWithValue("Banksort", "");

打开数据库连接:

exportConnection.Open();
            importConnection.Open();

使用从 SQL:

中提取的值填充上述字符串
var exportReader = exportCommand.ExecuteReader();

            while (exportReader.Read())
            {
                string part1 = exportReader.GetSqlValue(2).ToString();
                string part2 = exportReader.GetSqlValue(3).ToString();
                string space = " ";
                string code = exportReader.GetSqlValue(0).ToString();
                string clcode = exportReader.GetSqlValue(2).ToString();
                string title = exportReader.GetSqlValue(1).ToString();
                string sort1 = exportReader.GetSqlValue(20).ToString();
                string sort2 = exportReader.GetSqlValue(21).ToString();
                string sort3 = exportReader.GetSqlValue(22).ToString();
                // ID
                importCommand.Parameters["clcode"].Value = string.Concat(clcode,code);
                //
                importCommand.Parameters["clcodedesc"].Value = string.Concat(title,space,part1,space,part2);
                //OwTitle
                importCommand.Parameters["Title"].Value = exportReader.GetSqlValue(1).ToString();
                //OwForenames
                importCommand.Parameters["Fname"].Value = exportReader.GetSqlValue(2).ToString();
                //OwSurname
                importCommand.Parameters["Sname"].Value = exportReader.GetSqlValue(3).ToString();
                //OwNum
                importCommand.Parameters["Address1"].Value = exportReader.GetSqlValue(4).ToString();
                //[OwAddress1]
                //[OwAddress2]
                //[OwAddress3]
                //[OwAddress4]
                importCommand.Parameters["Address3"].Value = exportReader.GetSqlValue(5).ToString();
                importCommand.Parameters["Address5"].Value = exportReader.GetSqlValue(6).ToString();
                importCommand.Parameters["Address4"].Value = exportReader.GetSqlValue(7).ToString();
                importCommand.Parameters["Address6"].Value = exportReader.GetSqlValue(8).ToString();
                //OwPostcode
                importCommand.Parameters["Postcode"].Value = exportReader.GetSqlValue(9).ToString();
                //OwPhHome
                importCommand.Parameters["Phoneh"].Value = exportReader.GetSqlValue(10).ToString();
                //OwPhWork
                importCommand.Parameters["PhoneW"].Value = exportReader.GetSqlValue(11).ToString();
                //OwPhFax
                importCommand.Parameters["Facsimileh"].Value = exportReader.GetSqlValue(12).ToString();
                //OwPhMobile
                importCommand.Parameters["Mobile"].Value = exportReader.GetSqlValue(13).ToString();
                //OwEMail
                importCommand.Parameters["Emailaddr"].Value = exportReader.GetSqlValue(14).ToString();
                //OwBankName
                importCommand.Parameters["Bankname"].Value = exportReader.GetSqlValue(15).ToString();
                //OwAccNo
                importCommand.Parameters["Bankacno"].Value = exportReader.GetSqlValue(16).ToString();
                //OwAccName
                importCommand.Parameters["Bankacna"].Value = exportReader.GetSqlValue(17).ToString();
                //OwSalutation
                importCommand.Parameters["Salute"].Value = exportReader.GetSqlValue(18).ToString();
                //OwNotes
                importCommand.Parameters["Notes"].Value = exportReader.GetSqlValue(19).ToString();
                //OwSort1
                //OwSort2
                //OwSort3
                importCommand.Parameters["Banksort"].Value = string.Concat(sort1, sort2, sort3);

注释行是 SQL 数据库中的关联记录。

最后我执行查询并关闭连接:

  try
                {
                    importCommand.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    Console.Write("Error Writing to database");
                    Console.Write(e);
                    Console.ReadKey();
                }
            }

            // done
            Console.WriteLine("Complete!");
            Console.ReadKey();
            exportConnection.Close();
            importConnection.Close();

我的理论是这个字符串值:

                    importCommand.Parameters["Banksort"].Value = string.Concat(sort1, sort2, sort3);

导致问题,因为 table 中的第一条记录是 "NULL"

您肯定应该使用 AddWithValue。错误与此无关。您应该按照消息找出错误的原因:) 它说 "Must specify additional parameters"。这意味着您拥有的参数少于您真正应该提供的参数。 IOW 错误是在?占位符。它们按位置进行处理,并且必须与预期值计数相匹配。即:

insert into myTable (field1, field2) values (?,?)

是正确的,而:

insert into myTable (field1, field2) values (?)

会给出您看到的错误。你说,你有 2 列,但只指定 1 个参数占位符。加够了吗? (我可以看到 22 个值和 21 个 ? 存在于那里)。当然,不要忘记按照与预期参数相同的顺序添加参数(使用 AddWithValue)(第一个 AddWithValue() 绑定到第一个?因此 field1,第二个绑定到第二个?因此 field2 等等)。

PS:你可以这样写 SQL 这样你就不会计算 ?错误:

string fields = @"CLCODE
  ,clcodedesc
  ,Title
  ,Fname
  ,Sname
  ,Address1
  ,Address3
  ,Address5
  ,Address4
  ,Address6
  ,Postcode
  ,Phoneh
  ,PhoneW
  ,Facsimileh
  ,Mobile
  ,Emailaddr
  ,Bankname
  ,Bankacno
  ,Bankacna
  ,Salute
  ,Notes
  ,BANKSORT";

string sql = string.Format( "INSERT INTO CLIENT ({0}) values ({1})", 
  fields, 
  string.Join(",",fields.Split(',').Select(f => "?")));