当前位置:  开发笔记 > 编程语言 > 正文

从OleDb数据库读取/写入DataTable LINQ

如何解决《从OleDb数据库读取/写入DataTableLINQ》经验,为你挑选了1个好方法。

我目前的项目是从一个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中有什么可以帮我解决这个问题吗?



1> Thomas..:

如果列中的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文件并将其发布到数据库中.它有一个OleDbStorageDataLink用于发布到OleDb源.请参阅SqlServerStorage InsertRecord示例以了解如何(最终替换为SqlServerStorage的OleDbStorage).

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有