C# 参数数量错误(参数化查询)
问: 当我尝试执行以下参数化查询时:C# 参数数量错误(参数化查询),c#,asp.net,exception,informix,parameterized-query,C#,Asp.net,Exception,Informix,Parameterized Query,问: 当我尝试执行以下参数化查询时: INSERT INTO days (day,short,name,depcode,studycode,batchnum) values (?,?,?,?,?,?);SELECT SCOPE_IDENTITY(); 通过command.ExecuteScalar() 引发以下异常: 错误[07001][Informix.NET provider]参数数目错误 问题在哪里 编辑: public static int InsertDays(List<Da
INSERT INTO days (day,short,name,depcode,studycode,batchnum) values (?,?,?,?,?,?);SELECT SCOPE_IDENTITY();
通过command.ExecuteScalar()代码>
引发以下异常:
错误[07001][Informix.NET provider]参数数目错误
问题在哪里
编辑:
public static int InsertDays(List<Day> days)
{
int affectedRow = -1;
Dictionary<string, string> daysParameter = new Dictionary<string, string>();
try
{
foreach (Day a in days)
{
daysParameter.Add("day", a.DayId.ToString());
daysParameter.Add("short", a.ShortName);
daysParameter.Add("name", a.Name);
daysParameter.Add("depcode", a.DepCode.ToString());
daysParameter.Add("studycode", a.StudyCode.ToString());
daysParameter.Add("batchnum", a.BatchNum.ToString());
affectedRow = DBUtilities.InsertEntity_Return_ID("days", daysParameter);
daysParameter.Clear();
if (affectedRow < 0)
{
break;
}
}
}
catch (Exception ee)
{
string message = ee.Message;
}
return affectedRow;
}
publicstaticintinsertdays(列表天数)
{
int affectedRow=-1;
Dictionary daysParameter=新字典();
尝试
{
foreach(以天为单位的a天)
{
daysParameter.Add(“day”,a.DayId.ToString());
daysParameter.Add(“short”,a.ShortName);
daysParameter.Add(“名称”,a.name);
daysParameter.Add(“depcode”,a.depcode.ToString());
daysParameter.Add(“studycode”,a.studycode.ToString());
daysParameter.Add(“batchnum”,a.batchnum.ToString());
affectedRow=DBUtilities.InsertEntity\u Return\u ID(“天”,daysParameter);
daysParameter.Clear();
如果(影响速度<0)
{
打破
}
}
}
捕获(异常ee)
{
字符串消息=ee.message;
}
返回受影响的路径;
}
public static int InsertEntity\u Return\u ID(字符串tblName,字典dtParams)
{
int结果=-1;
DBConnectionForInformix DAL_Helper=新的DBConnectionForInformix(“”);
string[]field_names=新字符串[dtParams.Count];
dtParams.Keys.CopyTo(字段名称,0);
字符串[]字段_值=新字符串[dtParams.Count];
string[]field_valuesParam=新字符串[dtParams.Count];
dtParams.Values.CopyTo(字段值,0);
for(int i=0;i
您没有显示实际填充参数值的位置。鉴于你的问号数量正确,我怀疑这就是问题所在
编辑:好的,现在你已经发布了更多的代码,很明显出了什么问题:你的Return\u Scalar
方法不接受任何实际值!填充后,您不会在任何地方使用字段值。您需要在命令中设置参数
(顺便说一下,您还应该看看…您还没有显示实际填充参数值的位置。鉴于你的问号数量正确,我怀疑这就是问题所在
编辑:好的,现在你已经发布了更多的代码,很明显出了什么问题:你的Return\u Scalar
方法不接受任何实际值!填充后,您不会在任何地方使用字段值。您需要在命令中设置参数
(顺便说一下,您还应该查看…确保在提供参数的地方,其中一个值不为null。这可能会导致提供程序忽略该参数。如果这是您的问题,请通过DBNull
编辑
正如Jon所说,您需要使用command.Parameters
为命令提供查询中要使用的参数。确保在提供参数的地方,其中一个值不为null。这可能会导致提供程序忽略该参数。如果这是您的问题,请通过DBNull
编辑
正如Jon所说,您需要使用command.Parameters
为命令提供查询中使用的参数。这不应该是command.ExecuteOnQuery
?@Eben:我怀疑它是ExecuteScalar,因为“选择范围标识”部分。您在哪里添加了参数值?您应该有许多行添加到命令中。参数
…@Eben:不,他正在选择SCOPE\u IDENTITY()
,所以他希望从中返回值(您需要向右滚动)。啊!错过了选择
。我的错误:)这不应该是命令。ExecuteOnQuery
?@Eben:我怀疑这是由于“选择范围标识”部分而导致的ExecuteScalar。您在哪里添加了参数值?您应该有许多行添加到命令中。参数
…@Eben:不,他正在选择SCOPE\u IDENTITY()
,所以他希望从中返回值(您需要向右滚动)。啊!错过了选择
。我的坏:)@just_name:我已经编辑了我的答案。您并没有实际告诉数据库要使用什么值。@只是\u name:我已经编辑了我的答案。实际上,您并没有告诉数据库要使用哪些值。
public static int InsertEntity_Return_ID(string tblName, Dictionary<string, string> dtParams)
{
int Result = -1;
DBConnectionForInformix DAL_Helper = new DBConnectionForInformix("");
string[] field_names = new string[dtParams.Count];
dtParams.Keys.CopyTo(field_names, 0);
string[] field_values = new string[dtParams.Count];
string[] field_valuesParam = new string[dtParams.Count];
dtParams.Values.CopyTo(field_values, 0);
for (int i = 0; i < field_names.Length; i++)
{
field_valuesParam[i] = "?";
}
string insertCmd = @"INSERT INTO " + tblName + " (" + string.Join(",", field_names) + ") values (" + string.Join(",", field_valuesParam) + ");SELECT SCOPE_IDENTITY();";
Result = int.Parse(DAL_Helper.Return_Scalar(insertCmd));
return Result;
}