为什么会出现此错误?如何处理空值。 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 => "?")));
所以我正在写一个数据导出,在 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 => "?")));