2013-03-25 63 views
0

Access 2003中無法檢索的Microsoft Access自動編號值

VS 2010 C#

正如主題標題說我有這個問題。它將創建一個新的字段來打印日期和時間,以便在當前ID中標記日期和時間。我也試過UPDATE命令參數沒有成功。

我有一個不同的方法(btnloggedIn),它保存用戶名,登錄日期和登錄時間。這是應該的。我創建了另一種方法(btnLoggedOut),我遇到了問題。目的是保存已註銷日期和誰註銷用戶,在訪問中就列在登錄時在其中創建的自動識別已註銷時間

表名稱 - LoginTable

>

FieldName Data Type 
UserName Text 
Password Text 

表的名字 - LoginLogTable

FieldName  Data Type 

ID   AutoNumber 
UserName  Text 
LoggedInDate Date/Time 
LoggedInTime Date/Time 
LoggedOutDate Date/Time 
LoggedOutTime Date/Time 

ID是PK。它是一對多的關係。登錄的用戶可以有許多關於日期和時間的詳細信息

如果任何人都可以在這裏幫助我,我將不勝感激。

private void btnLogOut_Click(object sender, EventArgs e) 
    { 
     OleDbCommand cmd = new OleDbCommand(); 
     cmd.CommandType = CommandType.Text; 

     cmd.CommandText = " UPDATE [LoginLogTable] SET [LoggedOutDate] = ?, [LoggedOutTime] = ? 
     WHERE ID = ?"; 

     cmd.Parameters.AddWithValue("@LoggedOutDate", DateTime.Now.ToShortDateString()); 
     cmd.Parameters.AddWithValue("@LoggedOutTime", DateTime.Now.ToString("HH:mm")); 
     cmd.Connection = myCon; 
     myCon.Open(); 
     cmd.ExecuteNonQuery(); 
      Close(); 
    } 

這對於btnLogin方法的部分代碼...

OleDbCommand cmd = new OleDbCommand(); 
     cmd.CommandType = CommandType.Text; 

     cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES (@UserName, @LoggedInDate, @LoggedInTime)"; 

     cmd.Parameters.AddWithValue("@UserName", txtUserName.Text); 
     cmd.Parameters.AddWithValue("@LoggedInDate", DateTime.Now.ToShortDateString()); 
     cmd.Parameters.AddWithValue("@LoggedInTime", DateTime.Now.ToString("HH:mm")); 
     cmd.Connection = myCon; 
     myCon.Open(); 
     cmd.ExecuteNonQuery(); 
     myCon.Close(); 
+0

只是爲了澄清:這是一個ASP.NET(網絡)應用程序? – 2013-03-25 18:55:01

+0

@GordThompson - 沒有它的Windows窗體應用程序,爲什麼? – bucketblast 2013-03-25 18:59:32

+0

您必須首先構造*並執行* INSERT,然後運行「SELECT @@ IDENTITY」查詢來檢索INSERT剛剛創建的ID值。他們是單獨的操作。現在,您的代碼(顯然)試圖將這兩種操作結合​​起來,這是行不通的。另外,請記住,SELECT @@ IDENTITY將返回單個(標量)值,而不是行集,因此可能會影響調用它時調用的方法。 – 2013-03-25 22:32:06

回答

2

如果您在用戶單擊「註銷」按鈕時執行SELECT @@IDENTITY查詢,您將不可能獲得您希望的值。 SELECT @@IDENTITY意在在創建記錄的INSERT之後立即被調用(在這種情況下,當用戶在中記錄時)。然後,您可以將該值存儲在應用程序中,並在用戶註銷時使用它來選擇相同的記錄。

如果您的應用程序插入任何其他導致新身份的記錄(在其他表格中)「自動編號」)值將被創建,然後SELECT @@IDENTITY將返回那些值中的最近一個值。因此,只需在用戶登錄時抓取@@IDENTITY值,並在用戶再次註銷時保存它。

+0

我想我正在讀它,就好像它很簡單,眨眼。你能否證實你的最後一句話,關於@@ IDENTITY的問題,我想我知道你的意思是在btnLogOut方法中,但我仍然會Google。我需要時間來解決這個問題。所以先謝謝了。 – bucketblast 2013-03-25 21:04:19

+0

我的觀點是,您的'SELECT @@ IDENTITY'調用需要在'LoggedIn'代碼中進行,緊接在創建該登錄記錄的INSERT之後。您可以將'SELECT @@ IDENTITY'返回的值保存到您自己的應用程序中的一個變量中,然後在'LogOut'代碼的'UPDATE'語句的WHERE子句中使用它。 – 2013-03-25 21:14:13

+0

我在搜索如何將@@ IDENTITY中的返回值保存在變量中。 – bucketblast 2013-03-25 21:41:40

0

通常情況下,這樣做的方式是:

  1. 創建新的日誌記錄。
  2. 通過運行一個新的select來請求該特定用戶的最新登錄條目,以獲取其自動生成的記錄ID。您可以降序排序以確保它是記錄集中的第一條記錄。
  3. 使用該記錄ID來指定要使用WHERE ID = ?更新的登錄記錄,並用記錄ID填寫ID值。

當您不知道自動生成的主要記錄ID是什麼時,這是創建數據庫記錄時非常典型的模式。您可以創建新記錄,然後將其讀回到記錄標識中以獲取其自動生成的主鍵標識值,然後使用此時的記錄標識來引用它。

+0

re:第2步 - 一般而言,「SELECT MAX(ID)...」類型的方法在單用戶數據庫中工作正常,但在多用戶應用程序中不可靠。當然,在這種特殊情況下,我們有UserName來緩解這種情況,但如果允許多個併發登錄(例如,多個登錄爲'guest'),它仍然可能失敗。正確使用時,SELECT @@ IDENTITY更可靠。 – 2013-03-25 21:08:32

+0

我從模式使用中回答。你不執行'SELECT MAX(ID)',你執行一個'SELECT ID WHERE ...',並給出你剛用來創建條目的字段的細節,按照降序排序,所以如果有重複,你會得到最新的條目。在具有'IDENTIY'功能的特定情況下,除非有特殊原因,否則應該使用它。 – StarPilot 2013-03-25 21:15:59