【发布时间】:2009-05-19 10:35:18
【问题描述】:
将记录从 excel 文件上传到数据库中的表的最有效方法是什么。我不允许使用 DTS/SSIS。所以我想知道是否有比从文件中顺序读取记录并触发命令更好的选择。
谢谢。
【问题讨论】:
标签: sql-server-2005 vb6 ado
将记录从 excel 文件上传到数据库中的表的最有效方法是什么。我不允许使用 DTS/SSIS。所以我想知道是否有比从文件中顺序读取记录并触发命令更好的选择。
谢谢。
【问题讨论】:
标签: sql-server-2005 vb6 ado
您可以使用bcp 实用程序。将 Excel 文件另存为文本并将其 bcp 输入。您通常不需要批量插入权限来执行此操作。
【讨论】:
你有bulk inserting的权限吗?
【讨论】:
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.
}
}
【讨论】:
我建议您通过 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 记录集以正常方式操作连接。
希望对你有帮助
【讨论】: