我目前的项目是从一个OleDbDatabase
和.CSV文件中获取信息并将其全部放入更大的文件中OleDbDatabase
.
我已阅读目前在我从两个.CSV文件需要的所有信息,并OleDbDatabase
进入DataTables
....凡有越来越多毛正在写的所有的信息反馈给另一个OleDbDatabase.
现在我当前的方法是做这样的事情:
OleDbTransaction myTransaction = null; try { OleDbConnection conn = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Database); conn.Open(); OleDbCommand command = conn.CreateCommand(); string strSQL; command.Transaction = myTransaction; strSQL = "Insert into TABLE " + "(FirstName, LastName) values ('" + FirstName + "', '" + LastName + "')"; command.CommandType = CommandType.Text; command.CommandText = strSQL; command.ExecuteNonQuery(); conn.close(); catch (Exception) { // IF invalid data is entered, rolls back the database myTransaction.Rollback(); }
当然,这是非常基本的,我正在使用SQL命令将我的事务提交到连接.我的问题是我能做到这一点,但我有大约200个字段需要插入几个表.如果这是唯一的出路,我愿意做腿部工作.但我觉得有一种更简单的方法.LINQ中有什么可以帮我解决这个问题吗?
如果列中的DataTable
列名与目标表中的列名完全匹配,那么您可以使用a OleDbCommandBuilder
(警告:我还没有测试过).您可能遇到问题的一个方面是源数据表的数据类型是否与目标表的数据类型不匹配(例如,如果源列数据类型都是字符串).
编辑
我以多种方式修改了原始代码.首先,我切换到在DataTable上使用Merge方法.这允许我跳过使用LoadDataRow
循环.
using ( var conn = new OleDbConnection( destinationConnString ) ) { //query off the destination table. Could also use Select Col1, Col2.. //if you were not going to insert into all columns. const string selectSql = "Select * From [DestinationTable]"; using ( var adapter = new OleDbDataAdapter( selectSql, conn ) ) { using ( var builder = new OleDbCommandBuilder( adapter ) ) { conn.Open(); var destinationTable = new DataTable(); adapter.Fill( destinationTable ); //if the column names do not match exactly, then they //will be skipped destinationTable.Merge( sourceDataTable, true, MissingSchemaAction.Ignore ); //ensure that all rows are marked as Added. destinationTable.AcceptChanges(); foreach ( DataRow row in destinationTable.Rows ) row.SetAdded(); builder.QuotePrefix = "["; builder.QuoteSuffix= "]"; //forces the builder to rebuild its insert command builder.GetInsertCommand(); adapter.Update( destinationTable ); } } }
附加另一种解决方案是使用FileHelpers之类的框架来读取CSV文件并将其发布到数据库中.它有一个OleDbStorage
DataLink用于发布到OleDb源.请参阅SqlServerStorage InsertRecord示例以了解如何(最终替换为SqlServerStorage的OleDbStorage).