【问题标题】:Cannot add DataTable into MS Access table无法将 DataTable 添加到 MS Access 表中
【发布时间】:2013-05-31 14:53:11
【问题描述】:

我有一个 DataTable,其中包含从 SQL Server DB 的查询创建的大约 6000 行。现在我尝试将数据添加到 MS-Access 表中。一切似乎都奏效了。不会引发异常,但不会添加任何数据。这是我正在使用的代码:

DataTable t = new DataTable();
// fill data table


// Create DB - works!
var Name = DateTime.Now.ToString("H_mm_ss");

string strAccessConnectionString = @"Provider = Microsoft.Jet.OLEDB.4.0;" +
                                    @"Data Source=" + "C:\\chhenning\\" + Name + ".mdb;";

ADOX.CatalogClass Catalog = new ADOX.CatalogClass();
Catalog.Create(strAccessConnectionString);

OleDbConnection accessConnection = new OleDbConnection(strAccessConnectionString);
accessConnection.Open();

// Create Table - works!
OleDbCommand Command = accessConnection.CreateCommand();

Command.CommandText = "Create Table Test( "
    + " ID_ int not null "
    + " , Year_ int not null "
    + " , Value_ float not null )";

Command.ExecuteNonQuery();

// Add data into table - does not work!
var adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand("select * from Test", accessConnection);

var cbr = new OleDbCommandBuilder(adapter);
cbr.GetInsertCommand();

var Rows = adapter.Update(t);

我已确保我的 DataTable 中有数据,并且 DataTable 和 MS-Access 具有相同的列和相同的数据类型。

有人能发现代码有什么问题吗?我采取了哪些步骤来进一步调查问题?

【问题讨论】:

    标签: c# ms-access ado


    【解决方案1】:

    adapter.Update(table) 方法可以查看 DataTable 中行的 RowState
    如果行有RowState == DataRowState.Unchanged,则该方法不会执行任何更新。

    我假设您从 SqlServer 数据库加载数据表而不进行任何更改,因此每行的 RowState 都是未更改的。尝试在行上循环并调用

    foreach(DataRow r in t.Rows)
        r.SetAdded();
    

    这将强制每列上的 RowState 添加,然后 DataAdapter 上的 InsertCommand 将执行插入

    【讨论】:

    • Thant 似乎让我更进一步。现在我得到一个 InvalidOperationException。 “对于不返回任何键列信息的 SelectCommand,不支持为 UpdateCommand 生成动态 SQL。”我需要主键吗?
    • 是的,CommandBuilder 需要它。或者为 DataAdapter 编写自己的 InsertCommand
    • 好的,我在第一列中添加了主键,当我更新 adapter.Update() 的返回值时是正确的。但是当我在 MS-Access 中打开 mdb 文件时,仍然没有数据。
    • 我的错,你需要SetAdded来添加而不是SetModified
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多