2009-05-19 9 views
2

Excelファイルからデータベースのテーブルにレコードをアップロードする最も効率的な方法は何でしょうか。私はDTS/SSISの使用を許可されていません。ですから、私は、ファイルから順番にレコードを読み取り、コマンドを実行するよりも良い選択肢があるかどうかを知りたいと思います。DBにxlsレコードを効率的にアップロードする方法

ありがとうございました。

答えて

1

ADODB接続を使用してODBC/DSNを使用してExcelファイルに接続することをお勧めします。 これはかなり効率的であることがわかりました。

最初に、コントロールパネル>管理ツール>データソース(ODBC)というODBCデータソース名を作成します。 [システム]タブを選択し、[追加]をクリックします。表示されるドライバのリストから「Microsoft Excelドライバ」を選択します。あなたのDSNに「MYDB」という名前をつけ、xlSファイルをナビゲートしてダブルクリックして選択します。

これはプログラムで行うことができます。これは、5年前のようにDLLを作成し、まだソースコードの場所を特定しようとしているところです。私はすぐにコードを投稿します。次のようにあなたのDSNに接続することができますあなたのプログラムから次に

'declare the connection 
    Global MyConn As New ADODB.Connection 

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

あなたはその後、通常の方法でADODBレコードセットを介して接続を操作することができます。

私は、これは

+0

おかげで...あなたはいくつかのコードを投稿したり、私の参照リンクを与えることができますか?とても感謝しております。 –

1

あなたはbulk insertingの権限を持っていますか役に立てば幸い?

1

bcpユーティリティを使用できます。 Excelファイルをテキストとして保存し、bcpします。通常は、一括挿入権限は必要ありません。

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. 
     } 
    } 
関連する問題