2009-05-19 2 views
2

Что было бы самым эффективным способом загрузки записей из файла excel в таблицу в базе данных. Мне не разрешено использовать DTS/SSIS. Поэтому я хотел бы знать, есть ли более эффективная альтернатива, чем чтение записей последовательно из файла и команд стрельбы.Эффективный способ загрузки записей xls в DB

Спасибо.

ответ

1

Я предлагаю вам подключиться к файлу excel с использованием ODBC/DSN через соединение ADODB. Я обнаружил, что это довольно эффективно.

Сначала вы создаете имя источника данных ODBC: Панель управления> Средства администрирования> Источники данных (ODBC). Выберите вкладку «Система» и нажмите «Добавить». Выберите «Драйвер Microsoft Excel» из списка драйверов, которые появляются. Дайте вашему DSN имя сказать «MYDB», затем перейдите в файл xlS и дважды щелкните, чтобы выбрать.

Это можно сделать программно, просто, что мы создали dll, чтобы сделать это, как 5 лет назад, и Im все еще пытаюсь найти его исходный код. Я отправлю его код, как только я его получу.

Тогда из вашей программы вы можете подключиться к DSN следующим образом:

'declare the connection 
    Global MyConn As New ADODB.Connection 

    'open the connection 
    MyConn.Open "DSN=MYDB;pwd=;" 

Вы можете управлять соединение через ADODB списков записей в обычном порядке.

Я надеюсь, что это помогает

+0

Спасибо ... Вы можете разместить код или дать мне ссылку реф? Я был бы очень признателен. –

1

Вы можете использовать утилиту bcp. Сохраните файл Excel в виде текста и bcp. In. Обычно вам не нужны большие вставки для вставки.

1

This page имеет код, который делает обратное - извлекает данные из SQL Server и вставляет его в Excel. Все, что вам нужно сделать, это обмен строк подключения.

Как это:

private System.Data.OleDb.OleDbDataAdapter da ; 
    private System.Data.DataSet ds; 

    string sqlSelect="SELECT ProductId, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, GETDATE() as TimeExtracted from Products order by UnitPrice"; 

    string sqlInsert="INSERT INTO Foo (ProductId, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, TimeExtracted) VALUES (@ProductId, @ProductName, @QuantityPerUnit, @UnitPrice, @UnitsInStock, @TimeExtracted)"; 

    string ExtractedTableName= "ExtractedData"; 


    private void ReadFromSource() 
    { 
     System.Console.WriteLine("Reading from Source..."); 

     string ConnStringSource= 
      "Provider=Microsoft.Jet.OLEDB.4.0;" + 
      "Data Source=" + ExcelFilename + ";" + 
              "Extended Properties=\"Excel 8.0;HDR=yes;\""; // FIRSTROWHASNAMES=1;READONLY=false\" 

     using (var conn= new System.Data.OleDb.OleDbConnection(ConnStringSource)) 
     { 
      da= new System.Data.OleDb.OleDbDataAdapter(); 
      da.SelectCommand= new System.Data.OleDb.OleDbCommand(sqlSelect); 
      da.SelectCommand.Connection= conn; 

      // this tells the DA to mark all rows as newly inserted. 
      // upon calling da.Update() (later), all those rows will 
      // be inserted into the DB. 
      da.AcceptChangesDuringFill= false; 

      ds= new System.Data.DataSet(); 
      da.Fill(ds, ExtractedTableName); 
     } 
    } 


    private void InsertIntoDestination() 
    { 
     System.Console.WriteLine("Inserting data into Destination..."); 

     string ConnStringDest= "Provider=sqloledb;Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI;"; 

     using (var conn= new System.Data.OleDb.OleDbConnection(ConnStringDest)) 
     { 

      System.Data.OleDb.OleDbCommand cmd= new System.Data.OleDb.OleDbCommand(sqlInsert); 

      cmd.Parameters.Add("@ProductId", System.Data.OleDb.OleDbType.Integer, 4, "ProductId"); 
      cmd.Parameters.Add("@ProductName", System.Data.OleDb.OleDbType.VarWChar, 40, "ProductName"); 
      cmd.Parameters.Add("@QuantityPerUnit", System.Data.OleDb.OleDbType.VarWChar, 20, "QuantityPerUnit"); 
      cmd.Parameters.Add("@UnitPrice", System.Data.OleDb.OleDbType.Currency, 8, "UnitPrice"); 
      cmd.Parameters.Add("@UnitsInStock", System.Data.OleDb.OleDbType.SmallInt, 2, "UnitsInStock"); 
      cmd.Parameters.Add("@TimeExtracted", System.Data.OleDb.OleDbType.Date, 8, "TimeExtracted"); 

      da.InsertCommand= cmd; 
      da.InsertCommand.Connection= conn; 

      da.Update(ds, ExtractedTableName); 

      // in the event you want to update a datasource via a different DataAdapter -- 
      // for example you want to fill from a System.Data.SqlClient.DataAdapter and 
      // then Update via a System.Data.Oledb.OledbDataAdapter -- then you could define 
      // two distinct DataAdapters. Fill the DataSet with the first DA, then Update 
      // with the second DA. 
     } 
    } 
Смежные вопросы