【发布时间】:2016-05-14 16:45:48
【问题描述】:
我将数据表的数据发送到存储过程,该存储过程只是将数据插入表中,但出现错误
过程或函数 usp_InsertData 指定了太多参数。
当我使用分析器查看发生了什么时,我发现所有行都作为一行进入存储过程。
String strConnString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection();
public static void InsertData(DataTable dt)
{
String strConnString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection();
con.ConnectionString = strConnString;
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = ("usp_InsertData");
cmd.Connection = con;
con.Open();
for (int i = 1; i < dt.Rows.Count; i++)
{
cmd.Parameters.AddWithValue("@FirstIssue", dt.Rows[i][0].ToString());
cmd.Parameters.AddWithValue("@RTitle", dt.Rows[i][1].ToString());
cmd.Parameters.AddWithValue("@RFirstName", dt.Rows[i][2].ToString());
cmd.Parameters.AddWithValue("@RLastName", dt.Rows[i][3].ToString());
cmd.Parameters.AddWithValue("@RAddress1", dt.Rows[i][4].ToString());
cmd.Parameters.AddWithValue("@RAddress2", dt.Rows[i][5].ToString());
cmd.Parameters.AddWithValue("@RAddress3", dt.Rows[i][6].ToString());
cmd.Parameters.AddWithValue("@RCity", dt.Rows[i][7].ToString());
cmd.Parameters.AddWithValue("@RZip", dt.Rows[i][8].ToString());
cmd.Parameters.AddWithValue("@RCounty", dt.Rows[i][9].ToString());
cmd.Parameters.AddWithValue("@RCountry", dt.Rows[i][10].ToString());
cmd.Parameters.AddWithValue("@PTitle", dt.Rows[i][11].ToString());
cmd.Parameters.AddWithValue("@PFirstName", dt.Rows[i][12].ToString());
cmd.Parameters.AddWithValue("@PLastName", dt.Rows[i][13].ToString());
cmd.Parameters.AddWithValue("@PAddress1", dt.Rows[i][14].ToString());
cmd.Parameters.AddWithValue("@PAddress2", dt.Rows[i][15].ToString());
cmd.Parameters.AddWithValue("@PAddress3", dt.Rows[i][16].ToString());
cmd.Parameters.AddWithValue("@PCity", dt.Rows[i][17].ToString());
cmd.Parameters.AddWithValue("@PZip", dt.Rows[i][18].ToString());
cmd.Parameters.AddWithValue("@PCounty", dt.Rows[i][19].ToString());
cmd.Parameters.AddWithValue("@PCountry", dt.Rows[i][20].ToString());
cmd.Parameters.AddWithValue("@SubscriberAccountNumber", dt.Rows[i][21].ToString());
cmd.Parameters.AddWithValue("@OnSaleDate", dt.Rows[i][22].ToString());
cmd.Parameters.AddWithValue("@Subscriber", dt.Rows[i][23].ToString());
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
}
MessageBox.Show("data inserted");
con.Close();
con.Dispose();
}
谁能告诉我如何解决这个问题?
【问题讨论】:
-
此代码应在第二个循环中引发异常。如果不先清除集合,则不能使用相同的参数名称再次调用 AddWithValue
-
你为什么要这样做两次
SqlConnection con = new SqlConnection();还应该将所有 Sql 对象包装在using(){}周围,并将 for 循环放在 using 或将 forloop 分离到单独的方法等中。 . -
如果你想要一个简单的方法,例如使用执行 sql Insert 并解析参数,我将发布一个简单的方法,你可以使用它比你现在做的更干净
-
Insert statement look like your errorusp_InsertData 指定了太多参数是什么意思。` 非常不言自明,这意味着如果您有 26 个值,例如您正在传递,但存储的 proc 预计为 25...您'向存储过程传递了太多参数 -
正如@MethodMan 所说,存储过程的声明并不期望有这么多参数。您可以添加 sp 的第一行(只是预期的参数列表)吗?
标签: c# .net sql-server stored-procedures datatable