簡體   English   中英

在基於文件的數據庫上使用TableAdapter.Update插入新行時獲取ID

[英]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.

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