2012-02-08 2 views
1

Я использую объект SqlBulkCopy для записи datatable в таблицу сервера sql. Тем не менее, каждый раз, когда я проверяю свою базу данных, она остается неизменной без каких-либо изменений. AПочему мой SqlBulkCopy не работает

Я попытался выполнить поиск Google, чтобы определить свою проблему, но я не могу ее решить.

Данные относятся к файлу .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. Уверяю вас, что я соблюдаю правила Case Sensitive.

Tables

Существовал исключение не брошено и среднее время истекшее 0,018 - 0,020 сек

Цените любой помогает.

Спасибо

+0

Сколько строк имеет 'dt' в то время, когда вы вызываете« WriteToServer »? совпадают ли столбцы? (последнее, однако, должно проявляться в исключении, а не ничего делать) –

+0

Я думаю, что столбцы совпадают. В dt есть еще одна строка. Я также озадачен тем, почему он еще не работает, но он не стал исключением ... – rofans91

ответ

2

Основываясь на коде, который вы опубликовали, вы пишете пустую информацию, относящуюся к базе данных. Ваш метод ExportToGrid заполняет dt, объявленный локально DataTable, который теряет область вне метода. Ваша функция записи вызывает статический DataTable dt, который является новым datatable.

Должен ли быть статическим? кажется, что это может быть объявлен как

private DataTable dt; 

затем внутри «ExportToGrid» вместо того, чтобы объявить еще один DataTable просто экземпляр уже объявлен дт, а не объявить новый один

dt = new DataTable(); 

В качестве альтернативы можно извлечь DataTable прямо из GridView во время метода записи:

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

Это устраняет необходимость в переменных вне сферы действия мето д.

И наконец, поскольку вы храните свои данные в сеансе (я вообще не сторонник хранения больших объемов данных в переменных сеанса, но, не зная специфики вашего сайта, я не могу судить), вы можете использовать следующее :

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

Так оно и было. TQVM – rofans91

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" 

Я сомневаюсь, что строка соединения является проблемой при условии, котор вы использовали его в другом месте.

Наконец, вы проверили типы данных для столбцов в наборе данных, которые соответствуют данным в базе данных. По моему опыту, oledb load from excel не всегда производит вывод, который вы могли бы ожидать, поля даты и столбцы со смешанным текстом и номерами, являющиеся проблемными задачами.

Смежные вопросы