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;
        }