我想将一些数据从Excelfile移动到我的数据库。我用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”声明的specefice行。它正常工作。但当我使用for(),读取excell文件的所有行时,此代码有错误 这是错误:
过程或函数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();
}
我该怎么办? 在末尾 我不能说得很好,抱歉......
答案 0 :(得分:0)
- 这是批量插入的代码。编写一个函数来在没有参数的情况下在数据库中写入数据。在过程中使用相同的临时表在实际表中插入数据
public void WriteData()
{
using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
{
//System.Data.SqlClient.SqlBulkCopyOptions st = new System.Data.SqlClient.SqlBulkCopyOptions();
//GetBulkCopy(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString, SqlBulkCopyOptions.KeepIdentity)
using (System.Data.SqlClient.SqlBulkCopy bulk = new SqlBulkCopy(conn))
{
conn.Open();
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(TempTable, conn);
cmd.ExecuteNonQuery();
bulk.DestinationTableName = "#ImportData";
for (Int32 I = 0; I < DTFinal.Columns.Count; I++)
{
bulk.ColumnMappings.Add(DTFinal.Columns[I].ToString(), DTFinal.Columns[I].ToString());
}
bulk.WriteToServer(DTFinal);
cmd = new System.Data.SqlClient.SqlCommand("dbo.SP_AddStudent", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
}
//conn.Open();
//System.Data.SqlClient.SqlCommand
conn.Close();
}
}
答案 1 :(得分:0)
for(int i = 0; i&lt; Ds.Tables [0] .Rows.Count; i ++) Add_SQL(ⅰ);
通过这种方式,调用方法并执行代码并调用下一个方法可以延迟数据库可以管理数据