将xls记录上传到DB的有效方法

时间:2009-05-19 10:35:19

标签: sql-server-2005 vb6 ado

将记录从Excel文件上传到数据库中的表的最有效方法是什么。我不允许使用DTS / SSIS。所以我想知道是否有比从文件和触发命令顺序读取记录更好的选择。

感谢。

4 个答案:

答案 0 :(得分:1)

我建议您通过ADODB连接使用ODBC / DSN连接到Excel文件。 我发现这非常有效。

首先创建ODBC数据源名称thro:控制面板>管理工具>数据源(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记录集操作连接。

我希望这会有所帮助

答案 1 :(得分:1)

您是否拥有bulk inserting的权限?

答案 2 :(得分:1)

您可以使用bcp实用程序。将Excel文件另存为文本并将其bcp。您通常不需要批量插入权限来执行此操作。

答案 3 :(得分: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. 
        }
    }