首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从DataTable大容量插入到Access数据库

从DataTable大容量插入到Access数据库
EN

Stack Overflow用户
提问于 2014-06-11 06:52:17
回答 3查看 6.5K关注 0票数 0

已经填充了DataTable,但需要将其整个表内容转储到Access数据库中。

代码语言:javascript
复制
Using (conn)
    If conn.State <> ConnectionState.Open Then conn.Open()
    Dim adapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM " & sMdbTableName, conn)
    adapter.InsertCommand = New OleDbCommand("INSERT INTO " & sMdbTableName & " SELECT * FROM " & sMdbTableNameSource & ";", conn)
    adapter.TableMappings.Add(sMdbTableName, ds.Tables.Item(sMdbTableNameSource).ToString)
    adapter.Update(ds.Tables.Item(sMdbTableNameSource))
End Using

我正在尝试这样做,但没有错误,也没有添加数据。需要最好的表现方式。

谢谢

编辑:

更新的代码非常慢,需要批量的访问导入:

代码语言:javascript
复制
        Using (conn)
            If conn.State <> ConnectionState.Open Then conn.Open()
            Dim adapter As OleDbDataAdapter = New OleDbDataAdapter()
            adapter.InsertCommand = New OleDbCommand("INSERT INTO " & sMdbTableName & "(Field1, Field2, Field3, Field4, Field5) VALUES(@Field1, @Field2, @Field3, @Field4, @Field5);", conn)
            adapter.InsertCommand.Parameters.Add("Field1", OleDbType.VarChar, 16, "Field1")
            adapter.InsertCommand.Parameters.Add("Field2", OleDbType.VarChar, 16, "Field2")
            adapter.InsertCommand.Parameters.Add("Field3", OleDbType.VarChar, 16, "Field3")
            adapter.InsertCommand.Parameters.Add("Field4", OleDbType.VarChar, 16, "Field4")
            adapter.InsertCommand.Parameters.Add("Field5", OleDbType.VarChar, 16, "Field5")
            adapter.TableMappings.Add(sMdbTableName, ds.Tables.Item(sMdbTableNameSource).ToString)
            adapter.Update(ds.Tables.Item(sMdbTableNameSource))
        End Using
EN

回答 3

Stack Overflow用户

发布于 2014-06-11 06:57:35

问题是,DataTable中每个DataRowRowState都将为Unchanged,因此当您调用Update时,它们将被忽略。如果要插入这些行,则它们的RowState必须为Added。通过在调用Fill之前将数据适配器的AcceptChangesDuringFill属性设置为False,可以实现此目的。这将防止在填充DataTable之后调用AcceptChanges,这就是将RowState属性从Added更改为Unchanged的原因。如果这不是一个选项,那么您必须遍历这些行,并对每个行调用SetAdded

票数 1
EN

Stack Overflow用户

发布于 2019-07-05 05:24:10

代码语言:javascript
复制
Private Sub CopyDatatableToAccess(dt As DataTable, AccsessAddress As String, TableName As String)
    Try
        Dim connString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & AccsessAddress & ";Persist Security Info=False;"
        Dim accConnection As New OleDb.OleDbConnection(connString)
        Dim selectCommand As String = "SELECT <field1>, <field2> and so on FROM <table>" & TableName
        Dim accDataAdapter As New OleDb.OleDbDataAdapter(selectCommand, accConnection)
        Dim accCommandBuilder As New OleDb.OleDbCommandBuilder()
        accDataAdapter.InsertCommand = accCommandBuilder.GetInsertCommand()
        accDataAdapter.UpdateCommand = accCommandBuilder.GetUpdateCommand()
        Dim accDataTable As DataTable = dt.Copy()
        ''Just to make sure, set the RowState to added to make sure an Insert is performed'
        For Each row As DataRow In accDataTable.Rows '
            If row.RowState = DataRowState.Added Or DataRowState.Unchanged Then '
                row.SetAdded() '
            End If '
        Next '
        accDataAdapter.Update(accDataTable)
    Catch ex As Exception
    End Try
End Sub
票数 1
EN

Stack Overflow用户

发布于 2014-06-11 09:06:59

DataTables本质上使用所有逐行处理。

因此,如果您需要从.net代码推送到Access,则循环遍历表行并使用行中的值运行简单的Update语句-在一个单独的命令中-并不是最糟糕的事情。

DataTable中的Insert/Update“语句”将导致相同的行为。所以,如果你很累,不能让他们工作,你可以跳到一个单独的更新:)。

如果您打算使用SQLServer,那么SQLBulkCopy对象将是完美的,而且应该更快。不幸的是,我不知道Access有这样的对象。

这就是我们要搜索的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24152126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档