簡體   English   中英

WinForms DataGridView - 更新數據庫

[英]WinForms DataGridView - update database

我知道這是DataGridView的基本功能,但由於某種原因,我無法讓它工作。 我只希望Windows窗體上的DataGridView在用戶單擊“保存”按鈕時向數據庫提交對其進行的任何更改。

我根據DropDownList中用戶選擇觸發的函數填充DataGridView,如下所示:

using (SqlConnection con = new SqlConnection(conString))
{
    con.Open();
    SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife], rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix] FROM   dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con);
    DataSet ruleTableDS = new DataSet();
    ruleTableDA.Fill(ruleTableDS);
    RuleTable.DataSource = ruleTableDS.Tables[0];
}

在我的保存功能中,我基本上有以下內容(我已經修剪了一些代碼以便達到目的):

using (SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], 
       rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife],
       rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix]
       FROM dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con))
    {
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(ruleTableDA);
        DataTable dt = new DataTable();
        dt = RuleTable.DataSource as DataTable;
        ruleTableDA.Fill(dt);
        ruleTableDA.Update(dt);
    }

好的,所以我編輯了代碼來執行以下操作:構建命令,基於DataGridView(RuleTable)創建DataTable,使用DataTable填充DataAdapter,並更新數據庫。 現在ruleTableDA.Update(dt)拋出異常“並發沖突:UpdateCommand影響了預期的1條記錄中的0條。”

我相信這里有一些問題:要記住的順序是,當你加載網格時,它已經指向數據表/集合。 鍵入網格時,更改會暫時保留到綁定到網格的數據表中。 因此,您不希望每次保存時都創建數據表,因為忽略了對現有數據表所做的更改。 第二個問題是你可能不需要每次都創建一個綁定源,因為就像第一點一樣,如果網格顯示數據,那么它已經綁定了綁定源。 第三個問題是SQLCommandBuilder類具有GetInsertCommand,GetUpdateCommand等方法,必須使用它們來實際獲取適當的命令。

using (SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], 
       rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife],
       rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix]
       FROM dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con))
    {
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(ruleTableDA);
        DataTable dt = new DataTable();
        dt = RuleTable.DataSource as DataTable;
        //ruleTableDA.Fill(dt);
        ruleTableDA.Update(dt);
    }

MSDN文檔指出在手動設置SelectCommand時會自動設置update / delete / insert命令。 它沒有提到當你使用SqlDataAdapter構造一個時它也會這樣做。 嘗試在創建SqlCommanduBuilder后添加這些行。

ruleTableDA.UpdateCommand = commandBuilder.GetUpdateCommand()
ruleTableDA.InsertCommand = commandBuilder.GetInsertCommand()
ruleTableDA.DeleteCommand = commandBuilder.GetDeleteCommand()

您可能需要它來獲取更新命令

ruleTableDA.UpdateCommand = commandBuilder.GetUpdateCommand();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM