none
利用SqlBulkCopy多次导入sql server2000,但发生内容重复,求解决办法! RRS feed

  • 问题

  • 本人创建了一个程序,大致框架如下:

    触发button事件--->导入一张excel表,最终将excel表的数据导入sql server 2000

    button事件大略如下:

    {

      OpenFileDialog openFile1 = new OpenFileDialog();   //要求用户导入目标Excel表

      new DataSet();  

      new DataTable();

    {

         //  将Excel表元数据导入DataTable,生成多条DataRow

    }

      using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))    //将DataTable批量导入sql server 2000

      {

       bulkCopy.WriteToServer(DataTable);

       }

    }

    -----------------------------------------

    当点第一次button,导入表1之后,查询sql server,发现有一张表1的内容;

    但是,点第二次button,导入表2,再次查询sql server,却发现内容为:

    表1+表1+表2

    也就是说重复了表1的内容。跟踪SqlBulkCopy的运行次数:总共只为2,不是3。

    我试过在SqlBulkCopy之后写Dataset.Clear()和DataTable.Clear()也无济于事。

    请问问题出现在哪?解决办法是什么呢?

    2012年4月18日 11:46

答案

  • 或許你也可以參考這篇文章所使用的方法。

    http://www.eggheadcafe.com/community/asp-net/17/10387142/how-to-import-data-from-excel-file-to-sqlserver-in-aspnet.aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    谢谢您的帮助!我终于发现问题所在了,根源不在Excel进程是否回收,请看下面代码:

     
    button事件
    {
    string sql = @"select * from LifeInsuranceCompany";
                                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                                DataSet ds = new DataSet();
                                da.Fill(ds, "LifeInsuranceCompany");
    System.Data.DataTable dt = ds.Tables["LifeInsuranceCompany"];
    
    ///
    接下来进行AddRow和导库
    ///
    
    当点第二次button的时候,语句:da.Fill(ds, "LifeInsuranceCompany")导致了SqlDataAdapter先把上一次导入数据库的表先填充DataSet,所以产生表数据的重复。
    2012年4月19日 3:12

全部回复

  • 补充一下,数据库中对应的表没有主键,只有两个外键约束:-(
    2012年4月18日 11:59
  • 請問你的【将Excel表元数据导入DataTable,生成多条DataRow】這段程式碼是怎麼寫的?可以貼上來看一下嗎?謝謝。

    另外你有試著在你第二次按BUTTON前先將sql server中的資料先清除再按嗎?


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/


    2012年4月18日 23:00
  • 回复楼上的,我写的代码如下。另外发现一个现象,就是第一次打开的Excel要等到整个程式都退出了它才跟着退,但第二次以上的Excel调用完了立刻就退出了。

     for (int CompanyID = 1; CompanyID <= 6; CompanyID++)   //   填充DataTable
                                {
                                    range = datasheet.get_Range("D" + Rowarray[CompanyID - 1].ToString(), "K" + (Rowarray[CompanyID - 1]+5).ToString());
                                    Cellarray = (System.Array)range.Value;
                                    for (int InsuranceID = 1; InsuranceID <= 5; InsuranceID++)
                                    {
                                        DataRow newRow = dt.NewRow();
                                        newRow["year"] = year;
                                        newRow["month"] = month;
                                        newRow["CompanyID"] = CompanyID;
                                        newRow["InsuranceID"] = InsuranceID;
                                        newRow["NewInsurancePremium"] = (Cellarray.GetValue(InsuranceID, 1)!= null ? Cellarray.GetValue(InsuranceID,1) : DBNull.Value);
                                        newRow["RenewalPremium"] = (Cellarray.GetValue(InsuranceID, 3) != null ? Cellarray.GetValue(InsuranceID, 3) : DBNull.Value);
                                        newRow["ExpenditureAndPayment"] = (Cellarray.GetValue(InsuranceID, 5) != null ? Cellarray.GetValue(InsuranceID, 5) : DBNull.Value);
                                        newRow["GrossPremiumIncome"] = (Cellarray.GetValue(InsuranceID, 7) != null ? Cellarray.GetValue(InsuranceID, 7) : DBNull.Value);
                                        dt.Rows.Add(newRow);
                                    }
                                }

    2012年4月19日 1:02
  • 或许我可以把其他地方的相关程式也大概写一下:

    public Sheets sheets;
    public Worksheet datasheet;

    button事件

    {

      ①要求用户打开表;

      ②定义了Microsoft.Office.Interop.Excel.ApplicationClass app,

      WorkbookClass Workbook,

      object missing = Type.Missing,

      给sheets赋值,

      给datasheet赋值;

      ③调用导入数据库的函数LoadSheetsFunction;

      ④Excel回收:

     
    Workbook.Close();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(Workbook);
                    Workbook = null;
                    app.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                    app = null;
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets);
                    sheets = null;
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(datasheet);
                    datasheet = null;
                    GC.Collect();
    
    

    }

    2012年4月19日 1:13
  • 或許你也可以參考這篇文章所使用的方法。

    http://www.eggheadcafe.com/community/asp-net/17/10387142/how-to-import-data-from-excel-file-to-sqlserver-in-aspnet.aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年4月19日 2:19
  • 或許你也可以參考這篇文章所使用的方法。

    http://www.eggheadcafe.com/community/asp-net/17/10387142/how-to-import-data-from-excel-file-to-sqlserver-in-aspnet.aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    谢谢您的帮助!我终于发现问题所在了,根源不在Excel进程是否回收,请看下面代码:

     
    button事件
    {
    string sql = @"select * from LifeInsuranceCompany";
                                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                                DataSet ds = new DataSet();
                                da.Fill(ds, "LifeInsuranceCompany");
    System.Data.DataTable dt = ds.Tables["LifeInsuranceCompany"];
    
    ///
    接下来进行AddRow和导库
    ///
    
    当点第二次button的时候,语句:da.Fill(ds, "LifeInsuranceCompany")导致了SqlDataAdapter先把上一次导入数据库的表先填充DataSet,所以产生表数据的重复。
    2012年4月19日 3:12
  • 謝謝分享。

    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/


    2012年4月19日 3:14