2011-07-24 110 views
0

我试图通过使用AddWithValue()对象值的参数名称和对象[]的Array []的元素循环。 不幸的是,它说“过程或函数'sp_add_Request'期望参数'@RequestType',它没有被提供”。当我运行光标时,我可以看到提供的所有参数,我不明白问题出在哪里。请帮忙。请参见下面的代码:存储过程参数与AddWithValue()

object[] myValues = new Object[] { txtID.Text, ddlAmissionType.Text }; 
string[] paramsNames = new string[] { "@CHI", "@RequestType"}; 
dbConn.addData("sp_add_Request", paramsNames, myValues, lbMsg.Text); 

父类的方法:

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

回答

2

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

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对象的正确方法。

+0

乔希您好,我做了你所说的话,跑到光标,但我仍然得到同样的结果。当我检查参数值的计数时,它仍然显示一个。见我的变化如下: 尝试 { 对(INT I = 0;我 Jim

+0

看起来像它仍然在外面。我将以上面的样子编辑我的答案。 – Josh

+0

你好乔希,谢谢你,我做了你所建议的改变,它的工作。非常感谢。我也会尝试abatishchev的方法。谢谢你们 – Jim

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(); 
+0

非常感谢让我尝试AddRange ...但是,AddwithValue是否有问题,我尝试使用它? – Jim