2009-05-19 36 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. 
     } 
    } 
相关问题