将记录从Excel文件上传到数据库中的表的最有效方法是什么。我不允许使用DTS / SSIS。所以我想知道是否有比从文件和触发命令顺序读取记录更好的选择。
感谢。
答案 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.
}
}