【问题标题】:How do I commit the changes I have made to a DataTable to the Table from which I grabbed it?如何将我对 DataTable 所做的更改提交到我从中获取它的表中?
【发布时间】:2015-02-19 09:09:18
【问题描述】:

我正在开发一个简约的数据库界面,该界面从所有相关表中获取所有相关信息,并将该信息存储在本地数据表中,以便可以根据需要修改、更改、更新等信息,而无需维护与数据库的持续连接。

该方法完美运行,所有更改都反映并存储在表中,这很棒。

现在我需要知道如何将数据表中本地所做的更改反映到我从中获取表的数据库中。

在我看来,我读到的所有内容都在说“您需要保持连接才能做到这一点”,但因为对数据表进行更改可能需要一些时间,而且我听说最好的做法是只是建立一个连接,做你需要做的,然后离开,我在这里看到了一种冲突。

我引用的文章是this onethis one

这是获取表格的代码:

public static DataTable GetTable( string Table ) {
    string Query = "SELECT * FROM " + Table;
    return SQLLib.GetDataTable( Query, null );
}

private static DataTable GetDataTable( string CMD, object[] Params ) {
    DataSet DS = new DataSet( );
    using ( MySqlConnection MSQCon = new MySqlConnection( SQLLib.sqlconstr ) ) {
        try { MSQCon.Open( ); } catch ( MySqlException ) {
            Console.WriteLine( "Failed to open SQL Connection" );
        }
        MySqlDataAdapter MSQDA = new MySqlDataAdapter( );
        MySqlCommand MSQCom = new MySqlCommand( CMD, MSQCon );

        if (Params != null) for ( int c = 0; c < Params.Length; c++ )
            MSQCom.Parameters.AddWithValue( "@param_val_" + ( c + 1 ), Params[c] );
        MSQCom.CommandType = CommandType.Text;
        MSQDA.SelectCommand = MSQCom;
        MSQDA.Fill( DS );
        MSQCon.Close( );
    } try { return DS.Tables[0];
    } catch ( IndexOutOfRangeException ) { return SQLLib.GetDataTable( CMD, Params ); }
}

那么,现在有没有一种方法可以让我使用我在本地保存的 DataTable 更新源表,直到它准备好提交?

【问题讨论】:

    标签: c# mysql .net database datatable


    【解决方案1】:

    这不是保持连接打开,你只需要使用命令生成器,我相信 MySql 也是如此。

    private MySqlDataAdapter adapt;
    private DataSet someDataSet;
    someDataSet = new DataSet();
    
        public DataSet GetCustomerData(int customerId)
        {
            using(MySqlConnection connect = new MySqlConnection(ConnString))
            {
                connect.Open();
                MySqlCommand comm = new MySqlCommand("SELECT * FROM customers WHERE Id = @0", connect);
                someDataSet.Tables.Add("CustomersTable");
                comm.Parameters.AddWithValue("@0", customerId);
                adapt.SelectCommand = comm;
                adapt.Fill(someDataSet.Tables["CustomersTable"]);
            }
    
            return someDataSet;
       }
    

    现在进行更新: 你也可以使用一个新的适配器,但是你必须给它一个选择命令,基于这个命令构建器将执行插入、更新和删除命令。

        public void UpdateTable(DataTable table, int customerId)
        {
            using (MySqlConnection connect = new MySqlConnection(ConnString))
            {
                connect.Open();
                MySqlCommandBuilder commbuilder = new MySqlCommandBuilder(adapt);
                adapt.SelectCommand = new MySqlCommand("SELECT * FROM customers WHERE Id = "+customerId, connect); //or use parameters.addwithvalue
                adapt.Update(table);
            }
        }
    

    【讨论】:

    • 任何时候,我的代码中是否有任何错误?没有真正测试它,因为我没有 MySql 连接
    • 我不知道 MySqlCommandBuilder 的全部意义。那有方法 .GetUpdateCommand() ,我可以将其设置为 Adapters .Update 命令,然后当我在整个 dataset.tables 集合上调用 .Update 时,它​​应该可以完成这项工作。我仍然需要对其进行测试,但感觉是正确的道路。
    • 在你的代码中你有一个字符串'Table'作为表名?如果这不起作用,那么您可以在更新时提供表名。 adapt.Update(table,tableName); 我相信它必须是静态的
    • 我为数据集中的每个表执行一个 for-each 循环。当我完成表格后,我为集合中的每个表格分配了正确的名称,所以它应该很简单,只需说 Update(Table, Table.Name)
    【解决方案2】:

    您应该创建一个MySqlCommand 来更新您的数据库并将其设置为您的MySqlDataAdapterUpdateCommand 属性值。就像您为 SelectCommand 执行此操作一样。

    当你准备好提交时,你只需调用 MySqlDataAdapterUpdate() 方法。

    【讨论】:

    • 好的,但是在连接关闭的情况下如何工作?
    • 显然,您应该先打开它,就像在 GetDataTable() 方法中所做的那样。为此创建一个新的UpdateDataTable() 方法,或者将您的连接实例存储在某个地方,在您需要时保持打开状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2013-08-07
    • 2018-11-02
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    相关资源
    最近更新 更多