使用AddWithValue()存储过程参数

时间:2011-07-24 19:21:10

标签: c# .net stored-procedures ado.net

我正在尝试使用AddWithValue()通过参数名称的Array []和使用object[] myValues = new Object[] { txtID.Text, ddlAmissionType.Text }; string[] paramsNames = new string[] { "@CHI", "@RequestType"}; dbConn.addData("sp_add_Request", paramsNames, myValues, lbMsg.Text); 的对象值的Object []循环。 不幸的是,它说“过程或函数”sp_add_Request'需要参数'@RequestType',这是未提供的“。当我运行光标时,我可以看到提供的所有参数,我不明白问题出在哪里。请帮忙。请参阅以下代码:

public static bool addData(string storedProcName, string[] dynamicParamName, object[] aramVals, string msg)
{    
     for (int i = 0; i < dynamicParamName.Length; i++)
     {
          cmd2.Parameters.AddWithValue(dynamicParamName[i], paramVals[i]);
          //cmd2.Parameters.Add(dynamicParamName[i], dynamicParamValues[i]);

          try
          {
             if (cmd2.Connection.State == ConnectionState.Closed)
             {
                 cmd2.Connection.Open();
                 int stat = cmd2.ExecuteNonQuery();    
                 if (stat > 0)
                 {
                     res = true;
                     msg = "Recorded Added successfully";
                     cmd2.Connection.Close();
                     cmd2.Dispose();
                 }
           }
      }    
}

父方法:

{{1}}

2 个答案:

答案 0 :(得分:2)

您正在循环中访问数据库,因为该命令在for循环中执行。所以你在添加第二个参数之前执行命令。将try块移到for循环之外,你应该没问题。

public static bool addData(string storedProcName, string[] dynamicParamName, object[] paramVals, string msg)
{    
     for (int i = 0; i < dynamicParamName.Length; i++)
     {
          cmd2.Parameters.AddWithValue(dynamicParamName[i], paramVals[i]);
          //cmd2.Parameters.Add(dynamicParamName[i], dynamicParamValues[i]);
     }    
     try
     {
        if (cmd2.Connection.State == ConnectionState.Closed)
        {
            cmd2.Connection.Open();
        }
        int stat = cmd2.ExecuteNonQuery();    
        if (stat > 0)
        {
            res = true;
            msg = "Recorded Added successfully";
            cmd2.Connection.Close();
            cmd2.Dispose();
        }
     }  
}

您可能希望继续将连接对象放在一个自动处理的using语句中。 @ abatishchev的答案显示了处理ado对象的正确方法。

答案 1 :(得分:0)

每次调用方法时,创建,使用和配置新的连接/命令对象。这将使用连接池和其他性能积极的技术。

public static bool addData(string storedProcName, string[] dynamicParamName, object[] paramVals, string msg)
{
    SqlParameter[] paramArr = new SqlParameter[dynamicParamName.Length];
    for(int i = 0; i < dynamicParamName.Length; i++)
    {
        paramArr[i] = new SqlParameter(dynamicParamName[i], paramVals[i]);
    }

    using (SqlConnection connection = new SqlConnection(connectionString))
    using (SqlCommand command = connection.CreateCommand())
    {
        command.CommandText = commandText;
        //command.CommandType = CommandType.StoredProcedure ; // if needed

        command.Parameters.AddRange(paramArr);

        connection.Open();
        return command.ExecuteNonQuery() > 0;
    }
}

请参阅MSDNSqlParameterCollection.AddRange()方法。

你也可以使用LINQ:

SqlParameter[] paramArr = dynamicParamName
    .Select((paramName,i) => new SqlParameter(paramName, paramVals[i]).ToArray();

SqlParameter[] paramArr = Enumerable.Range(0, dynamicParamName.Length - 1)
    .Select(i => new SqlParameter(dynamicParamName[i], paramVals[i])
    .ToArray();