【问题标题】:move some data from excel to sql将一些数据从excel移动到sql
【发布时间】: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


【解决方案1】:

--这里是批量插入的代码。编写一个在没有参数的情况下将数据写入数据库的函数。在过程中,您使用相同的临时表在实际表中插入数据

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

            }
        }

【讨论】:

  • 希望大家看懂代码并进行相应修改。
【解决方案2】:

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

for (int i = 0; i

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

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多