[英]TableAdapter.Update not working after deleting a row using TableBindingNavigator
[英]Get id when inserting new row using TableAdapter.Update on a file based database
我有一個數據庫表,其中一個字段稱為ID,是一個自動遞增整數。 使用TableAdapter,我可以讀取和修改現有行以及創建新行。
但是,如果我嘗試修改新插入的行,則會收到DBConcurrencyException:
OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Shift.mdb;Persist Security Info=True");
ShiftDataSetTableAdapters.ShiftTableAdapter shiftTA = new ShiftDataSetTableAdapters.ShiftTableAdapter();
shiftTA.Connection = conn;
ShiftDataSet.ShiftDataTable table = new ShiftDataSet.ShiftDataTable();
ShiftDataSet.ShiftRow row = table.NewShiftRow();
row.Name = "life";
table.Rows.Add(row);
shiftTA.Update(row); // row.ID == -1
row.Name = "answer"; // <-- all fine up to here
shiftTA.Update(row); // DBConcurrencyException: 0 rows affected
一個單獨的問題,是否可以使用任何靜態類型的NewShiftRow()方法,這樣我每次插入新行時都不必創建表。
我猜代碼中的問題來自第一個Update()調用后仍為-1的row.ID。 插入成功,並且在數據庫中該行具有有效的ID值。
如何獲得該ID,以便我可以繼續進行第二次Update調用?
更新:
IT似乎可以使用此設置自動完成此操作 。 但是,根據msdn social上的答案,OLEDB驅動程序不支持此功能。
不確定從這里去哪里,使用oledb以外的其他工具?
更新:
嘗試使用SQLCompact,但發現它具有相同的限制 ,它不支持多條語句。
最后一個問題:是否有任何簡單的(基於單個文件的)數據庫可以讓您獲取插入行的值。
試試這個http://support.microsoft.com/kb/815629 ,但是示例代碼在VB.NET中。
或者,如果多行查詢在MS Access中被接受並且它具有用於檢索最后一個id的內置函數/變量,請使用此命令(盡管數據庫是SQLite): 無論如何,請看看為什么在這幾行代碼中得到此“並發沖突” ??? 並發沖突:UpdateCommand影響了預期的1條記錄中的0條 ,請嘗試使用google函數
[編輯:在我的機器上工作,我沒有SQL Server Compact,但是我沒有使用多語句]
public Form1()
{
InitializeComponent();
var c = Connect();
var da = new SqlDataAdapter("select emp_id, emp_firstname, emp_lastname from emp where 1 = 0", c);
var b = new SqlCommandBuilder(da);
var getIdentity = new SqlCommand("SELECT CAST(@@IDENTITY AS INT)", c);
da.InsertCommand = b.GetInsertCommand();
da.UpdateCommand = b.GetUpdateCommand();
da.DeleteCommand = b.GetDeleteCommand();
da.RowUpdated += (xsender, xe) =>
{
if (xe.Status == UpdateStatus.Continue && xe.StatementType == StatementType.Insert)
{
xe.Row["emp_id"] = (int)getIdentity.ExecuteScalar();
}
};
var dt = new DataTable();
da.Fill(dt);
var nr = dt.NewRow();
nr["emp_firstname"] = "john";
nr["emp_lastname"] = "lennon";
var nrx = dt.NewRow();
nrx["emp_firstname"] = "paul";
nrx["emp_lastname"] = "mccartney";
dt.Rows.Add(nr);
dt.Rows.Add(nrx);
da.Update(dt);
dt.AcceptChanges();
nrx["emp_lastname"] = "simon";
da.Update(dt);
nr["emp_lastname"] = "valjean";
da.Update(dt);
}
SqlConnection Connect()
{
return new SqlConnection(@"data source=.\SQLEXPRESS;Database=Test;uid=sa;pwd=hey");
}
為什么不選擇MAX(RowId),因為您的RowId應該為每個INSERT遞增? 這可能適合您嗎?
至於您的最終答案, SQLite可能是您的理想工具。 希望如此! 而且它具有自己的.NET數據提供程序,因此不需要OLEDB或ODBC提供程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.