2009-05-19 35 views

回答

1

我建議你通過ADODB連接使用ODBC/DSN連接到excel文件。 我發現這非常有效。

您首先創建一個ODBC數據源名稱:控制面板>管理工具>數據源(ODBC)。選擇「系統」選項卡並點擊「添加」。從出現的驅動程序列表中選擇「Microsoft Excel驅動程序」。爲您的DSN指定一個名稱'MYDB',然後導航xlS文件並雙擊進行選擇。

這可以通過編程方式完成,它只是我們創建了一個dll,像5年前那樣做,我仍然試圖找到它的源代碼。我會盡快發佈其代碼。

然後從你的程序,你可以連接到您的DSN,如下所示:

'declare the connection 
    Global MyConn As New ADODB.Connection 

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

然後,您可以通過操作記錄集ADODB以正常方式連接。

我希望這有助於

+0

謝謝...你可以發佈一些代碼,或給我一個參考鏈接?我真的很感激。 – 2009-05-19 11:54:52

1

您可以使用bcp實用程序。將Excel文件保存爲文本並將其插入。通常不需要批量插入權限即可。

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. 
     } 
    } 
相關問題