【问题标题】:Import Excel .xslx file into sql server : difficulty in updating table将 Excel .xlsx 文件导入 sql server:更新表的困难
【发布时间】:2014-04-01 22:11:30
【问题描述】:

我正在将 excel 文件导入 sql server 数据库。代码工作正常,但我目前正在做的方式是删除(清除表格)表格数据。

         string ssqltable = "tStudent";
          string myexceldataquery = "select id,student,rollno,course from [sheet1$]";
        try
        {
            string sexcelconnectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" + excelfilepath + "; Extended Properties=\"Excel 12.0; HDR=Yes; IMEX=2\"";
            string ssqlconnectionstring = "Data Source=DELL\\SQLSERVER1;Trusted_Connection=True;DATABASE=Test;CONNECTION RESET=FALSE";

            SqlConnection sqlconn = new SqlConnection(ssqlconnectionstring);
            SqlCommand sqlcmd = new SqlCommand(@"MERGE tStudent AS target
                              USING (select ID, STUDENT , ROLLNO from @source)  as source
                                ON (source.ID = target.ID)
                              WHEN MATCHED THEN
                              UPDATE SET Student = source.Student,
                                         ROLLNO = source.ROLLNO
                              WHEN NOT MATCHED THEN
                              INSERT (ID, STUDENT , ROLLNO)
                              VALUES (source.id, source.Student, source.RollNo);", sqlconn);
          ******************************************
            SqlParameter param = new SqlParameter();
            sqlcmd.Parameters.AddWithValue("@source", dr);
            param.SqlDbType = SqlDbType.Structured;
            param.TypeName = "dbo.tStudent";
          ******************************************
            sqlconn.Open();
            sqlcmd.ExecuteNonQuery();
            sqlconn.Close();

            //series of commands to bulk copy data from the excel file into our sql table
            OleDbConnection oledbconn = new OleDbConnection(sexcelconnectionstring);
            OleDbCommand oledbcmd = new OleDbCommand(myexceldataquery, oledbconn);

            oledbconn.Open();
            OleDbDataReader dr = oledbcmd.ExecuteReader();
            SqlBulkCopy bulkcopy = new SqlBulkCopy(ssqlconnectionstring);
            bulkcopy.DestinationTableName = ssqltable;

            bulkcopy.WriteToServer(dr);
            while (dr.Read())
            {
                //bulkcopy.WriteToServer(dr);
            }
            oledbconn.Close();
            Console.WriteLine(".xlsx file imported succssessfully into database.", bulkcopy.NotifyAfter);
        }

参见 * 部分。我已经在 Sqlparameters 中分配了我的 OleDb DataRreader dr,但我稍后会在代码中声明它。请指导我如何构建我的代码。

示例将不胜感激。

【问题讨论】:

  • 你想要INSERT 而不是更新。在 SQL 中,UPDATE 更改现有值。
  • @RadioSpace 我想在 Sql 中更新。有一段时间我正在删除数据并插入它。但现在我想更新这些数据。我觉得我传入的更新查询和参数不是正确的做法。谢谢。
  • @ConradFrix 我可以使用任何东西,只是我是初学者,我想要一些更简单的代码。我不熟悉合并和表值参数。谢谢。
  • @user2525244 - 所以你有固定的数据,好吧。您是否遇到错误或某些内容无法正常工作?
  • 如果我从 sql 表中删除所有数据然后执行导入,@RadioSpace Import 工作正常。但是如果我想更新表而不是删除,我就无法做到这一点。所以我想我不知道如何为更新编写更新参数化查询。所以请帮助更新参数化查询。谢谢。

标签: c# sql sql-server parameterized-query dynamicquery


【解决方案1】:

鉴于您的 excel 文件与您的表格具有相同的结构,并且您想要更新而不是仅仅插入,最简单的方法是使用 MergeTable-Valued Paramter

SqlCommand cmd = new SqlCommand(@"MERGE tStudent AS target
                                  USING (select ID, STUDENT , ROLLNO from @source)  as source
                                    ON (source.ID = target.ID)
                                  WHEN MATCHED THEN
                                  UPDATE SET Student = source.Student,
                                             ROLLNO = source.ROLLNO
                                  WHEN NOT MATCHED THEN
                                  INSERT (ID, STUDENT , ROLLNO)
                                  VALUES (source.id, source.Student, source.RollNo);"
                                   , sqlconn);

SqlParameter param cmd.Parameters.AddWithValue("@source", dr);
param.SqlDbType = SqlDbType.Structured;
param.TypeName = "dbo.tStudent";  

您的其他选项包括循环、使用临时表、将数据作为 xml 数据或字符串数​​据传递,或者使用 ETL 工具(如 SSIS)。

【讨论】:

  • 我忘记了“;”在 sql 字符串的末尾。我更新了答案
  • @user2525244。你没有声明@source。您在 sql 语句中按名称引用它,然后使用 Parameters.AddWithValue("@source", dr); 设置它的值。变量dr 是您使用OleDbDataReader dr = oledbcmd.ExecuteReader(); 设置的数据读取器
  • 对不起,我不清楚这一点。您需要摆脱 SQL 批量复制部分。您还需要在合并之前执行您的阅读器。
  • 您的阅读器似乎已关闭。如果您将 excel 文件加载到数据表中并传递它而不是数据读取器,您可能会取得更大的成功
  • dbo.tStudent 是您需要使用实际名称的示例名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
相关资源
最近更新 更多