将一些数据从excel移动到sql

时间:2015-05-21 05:50:40

标签: c# sql-server excel

我想将一些数据从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();




        }

我该怎么办?  在末尾 我不能说得很好,抱歉......

2 个答案:

答案 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)

我的猜测是正确的 输入数据的速度超过了数据库控制的速度,所以它不能解决它。 所以我把所有上面的代码放在一个方法(Add_SQL(int row))中用for循环调用它:

for(int i = 0; i&lt; Ds.Tables [0] .Rows.Count; i ++)                 Add_SQL(ⅰ);

通过这种方式,调用方法并执行代码并调用下一个方法可以延迟数据库可以管理数据