2012-02-08 178 views
1

我正在使用SqlBulkCopy對象將數據表寫入sql服務器表。但是,每次我重新檢查我的數據庫時,它都保持不變,沒有任何更改。 A爲什麼我的SqlBulkCopy不起作用

我試圖做谷歌搜索來確定我的問題,但我無法解決它。

數據表來自.xls文件。

public static DataTable dt = new DataTable(); 

private void ExportToGrid(String path, String filen) 
    { 
     int idx = filen.IndexOf("."); 
     string tf = filen.Remove(idx, 4); 

     OleDbConnection MyConnection = null; 
     DataSet DtSet = null; 
     OleDbDataAdapter MyCommand = null; 
     MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; Data Source='" + path + "';Extended Properties=Excel 8.0;"); 

     ArrayList TblName = new ArrayList(); 

     MyConnection.Open(); 
     DataTable schemaTable = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 
     foreach (DataRow row in schemaTable.Rows) 
     { 
      TblName.Add(row["TABLE_NAME"]); 
     } 

     MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [" + TblName[0].ToString() + "]", MyConnection); 
     DtSet = new System.Data.DataSet(); 

     MyCommand.Fill(DtSet); 
     MyCommand.FillSchema(DtSet, SchemaType.Source); 

     DataTable dt = new DataTable(); 
     dt = DtSet.Tables[0]; 
     Session["dt"] = dt; 
     int x = dt.Rows.Count; 
     MyConnection.Close(); 

     if (dt.Rows.Count > 0) 
     { 
      theGridView.DataSource = dt; 
      theGridView.DataBind(); 
     } 

     if (System.IO.File.Exists(path)) 
     { 
      System.IO.File.Delete(path); 
     } 

    } 

這是我寫器功能

private void StartImport() 
    { 
     string servername = server; 
     string database = database; 
     string tbl = "dbo.LinkDb"; 

     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 
     SqlBulkCopy bulkCopy = new SqlBulkCopy("Data Source=" + servername + ";Initial Catalog=" + database + ";Integrated Security=SSPI", SqlBulkCopyOptions.TableLock); 
     bulkCopy.DestinationTableName = tbl; 
     bulkCopy.WriteToServer(dt); 
     sw.Stop(); 
     lblResult.Visible = true; 
     lblResult.Text = (sw.ElapsedMilliseconds/1000.00).ToString(); 
    } 

下面是存儲在我的SQL Server表的截圖。我向你保證,我一直遵從區分大小寫的規則。

Tables

有沒有異常拋出經過平均時間是0.018 - 0.020秒

欣賞任何幫助。

謝謝

+0

當您調用'WriteToServer'時,'dt'有多少行?這些列是否匹配? (後者雖然應該表現爲例外,而不是做任何事情) – 2012-02-08 08:28:22

+0

我認爲這些列匹配。 dt中還有一行。我也感到困惑,爲什麼它不工作,它沒有拋出任何異常...... – rofans91 2012-02-08 08:34:06

回答

2

根據您發佈的代碼,您正在向數據庫寫入一個空的數據表。你的「ExportToGrid」方法填充了dt,一個本地聲明的DataTable,它丟失了方法以外的作用域。您的寫入函數正在調用靜態DataTable dt,它是一個新的數據表。

dt是否需要靜態?這似乎不是宣告另一個數據表只是實例化了,好像這可能被宣佈爲

private DataTable dt; 

然後裏面的「ExportToGrid」已經宣佈DT,而不是宣佈一個新的

dt = new DataTable(); 

另外,您可以提取在寫入過程中直接從GridView獲取DataTable方法:

DataTable dt = (DataTable)theGridView.DataSource; 
bulkCopy.WriteToServer(dt); 

這消除了對方法範圍之外的變量的需要d。

最後,因爲您正在將會話數據存儲在會話中(我通常不主張在會話變量中存儲大量數據,但不知道網站的具體細節,我無法真正通過判斷),您可以使用以下:

DataTable dt = (DataTable)Session["dt"]; 
bulkCopy.WriteToServer(dt); 
+0

這就是它。 TQVM – rofans91 2012-02-09 01:37:56

0

我沒有看到比除了事實上,我明確地從數據表中的列映射到數據庫表我用什麼明顯。

Using cn As New SqlConnection(DataAccessResource.CONNECTIONSTRING) 
    cn.Open() 
    Using copy As New SqlBulkCopy(cn) 
     copy.BulkCopyTimeout = 300 
     copy.ColumnMappings.Add(0, 0) 
     copy.ColumnMappings.Add(1, 1) 
     copy.ColumnMappings.Add(2, 2) 
     copy.ColumnMappings.Add(3, 3) 
     copy.DestinationTableName = "Tablename" 
     copy.WriteToServer(dataset.datatable) 
    End Using 
End Using 

連接字符串(SQL Server 2000中!)看起來像

"data source=DBSERVERNAME;initial catalog=DBNAME;persist security info=True;user id=USERNAME;password=PASSWORD;packet size=4096" 

我懷疑連接字符串是假定你已用它在其他地方有問題。

最後是否檢查了數據集數據表中與數據庫中的列匹配的數據類型。根據我的經驗,來自excel的oledb加載不會總是產生您可能期望的輸出,日期字段和列中包含混合文本和數字的問題。