【发布时间】:2015-05-21 05:50:39
【问题描述】:
我想将一些数据从 Excel 文件移动到我的数据库。我用c# 这是我的代码:
//conecting to DB
SqlConnection sqlcon = new SqlConnection("Data Source=.;Initial Catalog=ghalamchi;Integrated Security=True");
SqlCommand SqlCmd = new SqlCommand();
SqlCmd.Connection = sqlcon;
SqlCmd.CommandType = CommandType.StoredProcedure;
SqlCmd.CommandText = "SP_AddStudent";
int counter = 0;
int i = 21;
{
SqlCmd.Parameters.Add("@id", SqlDbType.Char, 20).Value = Ds.Tables[0].Rows[i][0].ToString();
SqlCmd.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = Ds.Tables[0].Rows[i][1].ToString();
SqlCmd.Parameters.Add("@family", SqlDbType.NVarChar, 80).Value = Ds.Tables[0].Rows[i][2].ToString();
SqlCmd.Parameters.Add("@codeM", SqlDbType.Char, 15).Value = Ds.Tables[0].Rows[i][3].ToString();
//SqlCmd.Parameters.Add("@city", SqlDbType.NVarChar, 30).Value = txb_city.Text;
//SqlCmd.Parameters.Add("@street", SqlDbType.NVarChar, 40).Value = txb_street.Text;
SqlCmd.Parameters.Add("@Addres", SqlDbType.NVarChar, 150).Value = Ds.Tables[0].Rows[i][4].ToString();
SqlCmd.Parameters.Add("@telephon", SqlDbType.NChar, 15).Value = Ds.Tables[0].Rows[i][5].ToString();
SqlCmd.Parameters.Add("@mobile", SqlDbType.NChar, 15).Value = Ds.Tables[0].Rows[i][6].ToString();
SqlCmd.Parameters.Add("@rabet1", SqlDbType.NChar, 15).Value = Ds.Tables[0].Rows[i][7].ToString();
SqlCmd.Parameters.Add("@rabet2", SqlDbType.NChar, 15).Value = Ds.Tables[0].Rows[i][8].ToString();
SqlCmd.Parameters.Add("@SchoolName", SqlDbType.NVarChar, 50).Value = Ds.Tables[0].Rows[i][9].ToString();
SqlCmd.Parameters.Add("@avg", SqlDbType.Char, 6).Value = Ds.Tables[0].Rows[i][10].ToString();
SqlCmd.Parameters.Add("@returnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
sqlcon.Open();
SqlCmd.ExecuteNonQuery();
if (SqlCmd.Parameters["@returnValue"].Value.ToString() == "1")
counter++;
sqlcon.Close();
}
在这段代码中,读取使用变量“i”声明的特定行。它工作正常。但是当我使用 for() 来读取 Excel 文件的所有行时,此代码有错误 这是错误:
过程或函数 SP_AddStudent 指定的参数过多。
我认为这个错误发生了,因为 db 的速度很低,它不能快速读取和写入所有行
for (int i = 0; i < Ds.Tables[0].Rows.Count; i++)
{
SqlCmd.Parameters.Add("@id", SqlDbType.Char, 20).Value = Ds.Tables[0].Rows[i][0].ToString();
SqlCmd.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = Ds.Tables[0].Rows[i][1].ToString();
SqlCmd.Parameters.Add("@family", SqlDbType.NVarChar, 80).Value = Ds.Tables[0].Rows[i][2].ToString();
SqlCmd.Parameters.Add("@codeM", SqlDbType.Char, 15).Value = Ds.Tables[0].Rows[i][3].ToString();
//SqlCmd.Parameters.Add("@city", SqlDbType.NVarChar, 30).Value = txb_city.Text;
//SqlCmd.Parameters.Add("@street", SqlDbType.NVarChar, 40).Value = txb_street.Text;
SqlCmd.Parameters.Add("@Addres", SqlDbType.NVarChar, 150).Value = Ds.Tables[0].Rows[i][4].ToString();
SqlCmd.Parameters.Add("@telephon", SqlDbType.NChar, 15).Value = Ds.Tables[0].Rows[i][5].ToString();
SqlCmd.Parameters.Add("@mobile", SqlDbType.NChar, 15).Value = Ds.Tables[0].Rows[i][6].ToString();
SqlCmd.Parameters.Add("@rabet1", SqlDbType.NChar, 15).Value = Ds.Tables[0].Rows[i][7].ToString();
SqlCmd.Parameters.Add("@rabet2", SqlDbType.NChar, 15).Value = Ds.Tables[0].Rows[i][8].ToString();
SqlCmd.Parameters.Add("@SchoolName", SqlDbType.NVarChar, 50).Value = Ds.Tables[0].Rows[i][9].ToString();
SqlCmd.Parameters.Add("@avg", SqlDbType.Char, 6).Value = Ds.Tables[0].Rows[i][10].ToString();
SqlCmd.Parameters.Add("@returnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
sqlcon.Open();
SqlCmd.ExecuteNonQuery();
if (SqlCmd.Parameters["@returnValue"].Value.ToString() == "1")
counter++;
sqlcon.Close();
}
我该怎么办? 在末尾 我英语说得不好,对不起...
【问题讨论】:
-
这不是速度问题。您的 c# 代码中的参数比您在存储过程中指定的参数更多。尝试将错误消息翻译成您的母语(逐字逐句,而不是使用谷歌翻译)。
-
这是使用c#将数据从excel导入数据库的要求吗?或者任何其他方式是可能的?
-
可能你在这里过于复杂了,有更直接的方法可以将 Excel 导入 SQL Server,参见例如codeproject.com/Tips/636719/…
-
参数个数是正确的,因为当我不使用for()时,它运行正常
-
你能不能用 1 开始你的 for 循环。
标签: c# sql-server excel