如何使用 oleDbDataAdapter.Update(myDataSet) 更新 excel 文件

Posted

技术标签:

【中文标题】如何使用 oleDbDataAdapter.Update(myDataSet) 更新 excel 文件【英文标题】:How do I update excel file with oleDbDataAdapter.Update(myDataSet) 【发布时间】:2012-05-10 14:03:13 【问题描述】:

我不断收到 InvalidOperationException(“当传递带有修改行的 DataRow 集合时,更新需要有效的 UpdateCommand”)。我只是无法弄清楚更新命令出了什么问题。

这是我目前的代码:

    OleDbConnection connection;
    OleDbDataAdapter clientsAdapter new OleDbDataAdapter();
    DataSet myDataSet = new DataSet();

    public void Setup()
    
        connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Clients.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"";";
        connection = new OleDbConnection(connectionString);
        connection.Open();


        // SQL
        clientsAdapter.SelectCommand = new OleDbCommand("SELECT * FROM [Clients$]", connection);
        OleDbCommand updateCmd = new OleDbCommand(
            "UPDATE [Clients$] " + 
            "SET " +
                "[Family Name] = ?, " +
                "[Given Name] = ?, " + 
                "Address = ?, " + 
                "[Home Phone] = ?, " + 
                "[Work Phone] = ?, " + 
                "[Mobile Phone] = ?, " + 
                "Email = ?, " + 
                "Status = ?, " + 
                "Comments = ? " + 
            "WHERE " + 
                "[Last Name] = ? AND " + 
                "[First Name] = ?"

        // SET clause
        updateCmd.Parameters.Add("Family Name", OleDbType.Char, 100, "Family Name");
        updateCmd.Parameters.Add("Given Name", OleDbType.Char, 100, "Given Name");
        updateCmd.Parameters.Add("Address", OleDbType.Char, 100, "Address");
        updateCmd.Parameters.Add("Home Phone", OleDbType.Double, 100, "Home Phone");
        updateCmd.Parameters.Add("Work Phone", OleDbType.Char, 100, "Work Phone");
        updateCmd.Parameters.Add("Mobile Phone", OleDbType.Char, 100, "Mobile Phone");
        updateCmd.Parameters.Add("Email", OleDbType.Char, 100, "Email");
        updateCmd.Parameters.Add("Status", OleDbType.Char, 100, "Status");
        updateCmd.Parameters.Add("Comments", OleDbType.Char, 100, "Comments");

        // WHERE clause
        OleDbParameter fName = updateCmd.Parameters.Add("Old Family Name", OleDbType.Char, 100, "Family Name");
        fName.SourceVersion = DataRowVersion.Original;
        OleDbParameter lName = updateCmd.Parameters.Add("Old Given Name", OleDbType.Char, 100, "Given Name");
        lName.SourceVersion = DataRowVersion.Original;

        clientsAdapter.InsertCommand = updateCmd;

        // create table and fill
        DataTable clients = new DataTable("Clients");
        clientsAdapter.Fill(clients);
        myDataSet.Tables.Add(clients);

        connection.Close();
    

    public void UpdateDb()
    
        connection.Open();
        clientsAdapter.Update(myDataSet, "Clients");  // errer occurs here
        connection.Close();
    

虽然google上有几个简单的例子,但我一直没能找到解决办法。

【问题讨论】:

您有一个InsertCommand。你的UpdateCommand呢? 请不要将“-C#”等附加到您的标题中。这就是标签的用途。 【参考方案1】:

您尚未设置 clientsAdapter 的 UpdateCommand 属性。

您已经创建了一个名为“updateCmd”的OleDbCommand,但随后您已为其设置了 InsertCommand 属性:

clientsAdapter.InsertCommand = updateCmd;

我怀疑你想要:

clientsAdapter.UpdateCommand = updateCmd;

【讨论】:

天哪,我不敢相信我做到了(为我服务,适合复制和粘贴)。那完全在我的待办事项清单上:-/.

以上是关于如何使用 oleDbDataAdapter.Update(myDataSet) 更新 excel 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?