2012-06-22 62 views
2

我正在做這個小項目來了解.NET 4.0和SQL Server 2008 R2中的斷開連接模型。如何從類型化數據集中刪除一行並將其保存到數據庫?

我有三個表:

Companies (PK CompanyID) 
Addresses (PK AddressID, FK CompanyID) 
ContactPersons (PK ContactPersonID, FK CompanyID) 

CompanyID是由用戶手動分配。其他ID是自動生成的。公司與ContactPerson有一對多的關係。我已設置任何更改級聯。

我在DataGridView的公司中顯示所有記錄,當單擊一行時,ContactPersons中的相應記錄顯示在第二個DataGridView中。

我已經成功地實現了更新和插入新記錄,但我完全失敗了,試圖刪除行並將更改保存到數據庫。

我是一個打字的數據集。

如果我用這個:

DataRow[] contactPersonRows = m_SoldaCompaniesFileDataSet.ContactPersons.Select("ContactPersonID = " 
                + this.m_CurrentContactPerson.ContactPersonID); 

m_SoldaCompaniesFileDataSet.ContactPersons.Rows.Remove(contactPersonRows[0]); 

的記錄正確顯示在DataGridView但後來不保存在數據庫中。

如果我用這個:

DataRow row = m_SoldaCompaniesFileDataSet.ContactPersons.Rows.Find(this.m_CurrentContactPerson.ContactPersonID); 
row.Delete(); 

的記錄集,但我得到一個exeception:DeletedRowInaccessibleException,當我嘗試刷新DataGridView的。自動生成的dataset.design文件中出現異常彈出窗口。

從昨天開始,我幾乎停留在這一點上。我找不到任何遠程類似於我的問題的地方。我實際上無法理解發生了什麼事。

+0

在Delete()後面使用m_SoldACompaniesFileDataSet.AcceptChanges()。 –

+0

感謝您的回答!根據文檔: Remove()就像調用Delete()然後AcceptChanges(); 我已經嘗試過,並且它不起作用。 我嘗試了各種組合。我在設計器中設置了一個DeleteCommand,如下所示: DELETE FROM ContactPersons WHERE(ContactPersonID = @Original_ContactPersonID) – Zingam

+0

僅刪除從集合中刪除記錄刪除從數據庫中永久刪除數據也在調用AcceptChnages時刪除數據。 –

回答

1

我一直在做的LINQ到數據集查詢是這樣的:

var dataRows_ContactPersons = from row in this.m_SoldaCompaniesFileDataSet.ContactPersons 
           where row.CompanyID == companyID 
           select new 
           { 
            ContactPersonID = row.ContactPersonID, 
            CompanyID = row.CompanyID, 
            NameFirst = row.NameFirst, 
            NameLast = row.NameLast, 
            PhoneNumber = row.PhoneNumber, 
            EmailAddress = row.EmailAddress, 
            Position = row.Position 
           }; 

我花了相當長的一段時間來弄清楚,我需要做這個檢查,以排除LINQ查詢被刪除的行:

row.RowState != DataRowState.Deleted 

所以上面的代碼是固定的那樣:

var dataRows_ContactPersons = from row in this.m_SoldaCompaniesFileDataSet.ContactPersons 
           where row.RowState != DataRowState.Deleted && row.CompanyID == companyID 
           select new 
           { 
            ContactPersonID = row.ContactPersonID, 
            CompanyID = row.CompanyID, 
            NameFirst = row.NameFirst, 
            NameLast = row.NameLast, 
            PhoneNumber = row.PhoneNumber, 
            EmailAddress = row.EmailAddress, 
            Position = row.Position 
           }; 

沒有更多DeletedRowIn accessibleException :)請注意,檢查一行是否處於已刪除狀態必須在代碼中的任何位置執行。

相關問題