2013-03-26 71 views
0

Access 2003中語法錯誤(缺少操作員)在查詢表達式 '@ID = @@ IDENTITY' II

VS 2010 C#

正如主題標題說我有問題。這與我先前提出的問題有關,Here。我希望mod可以用這個線程,但我不確定。

Martin Parkin建議在使用C#和MS-Access時使用@@Identity時,不要關閉Insert和Select之間的連接。我認爲我已經開始工作,直到我發現情況並非如此。說實話,我不知道如何解決這個問題。所以如果任何人都可以幫助我,我將不勝感激。

這是我btnLogin方法..

 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(); 

     cmd.CommandText = "SELECT @ID = @@IDENTITY"; 
    // cmd.Parameters.AddWithValue("@ID", OleDbType.WChar); << tried this, unsuccessful 
     int id = (int)cmd.ExecuteScalar(); // getting the same error? 
     myCon.Close(); 

這是我btnLogOut方法...

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

     int id = 0; 
     cmd.CommandText = " UPDATE [LoginLogTable] SET [LoggedOutDate] = @LoggedOutDate, [LoggedOutTime] = @LoggedOutTime WHERE [ID] = @ID"; 
     cmd.Parameters.AddWithValue("@ID", 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方法,如果我做

cmd.CommandText = "SELECT @ID = @@IDENTITY";

並隱藏其後的cmd.ExecuteNonQuery();。然後日期和時間將記錄在數據庫中,但日期和時間不會保存在數據庫中,用於註銷。

我不確定問題是否與btnLogin方法或btnLogOut方法或兩者兼而有之。

工作液

我原本

cmd.CommandText = " UPDATE [LoginLogTable] SET [LoggedOutDate] = @LoggedOutDate, 
[LoggedOutTime] = @LoggedOutTime WHERE [ID] = @ID"; 
cmd.Parameters.AddWithValue("@ID", id); 
cmd.Parameters.AddWithValue("@LoggedOutDate", DateTime.Now.ToShortDateString()); 
cmd.Parameters.AddWithValue("@LoggedOutTime", DateTime.Now.ToString("HH:mm")); 

然後我做了這個

cmd.CommandText = " UPDATE [LoginLogTable] SET [UserName] = @UserName, [LoggedOutDate] = 
@LoggedOutDate, [LoggedOutTime] = @LoggedOutTime WHERE ID = @ID"; 
cmd.Parameters.AddWithValue("@UserName", txtUserName.Text); 
cmd.Parameters.AddWithValue("@LoggedOutDate", DateTime.Now.ToShortDateString()); 
cmd.Parameters.AddWithValue("@LoggedOutTime", DateTime.Now.ToString("HH:mm")); 
cmd.Parameters.AddWithValue("@ID", id); 

由於d士丹利和戈德·湯普森。

回答

3

@ID變量不會像您認爲的那樣持續存在於數據庫中。連接關閉時(可能會更快),它將超出範圍。我會建議您存儲您的應用程序,而不是在新的身份:

假設這些按鈕處理程序窗體上的方法,你可以在ID存儲爲形式的屬性:

// somewhere in the form definition: 
    private int ID {get; set;} 
    ... 

    cmd.CommandText = "SELECT @@IDENTITY"; 
    int id = (int)cmd.ExecuteScalar(); 
    this.ID = id; 

然後使用您的註銷方法中的ID:

// get the id from the form 
    int id = this.ID; 

    cmd.CommandText = " UPDATE [LoginLogTable] SET [LoggedOutDate] = @LoggedOutDate, [LoggedOutTime] = @LoggedOutTime WHERE [ID] = @ID"; 
    cmd.Parameters.AddWithValue("@ID", id); 
    cmd.Parameters.AddWithValue("@LoggedOutDate", DateTime.Now.ToShortDateString()); 
    cmd.Parameters.AddWithValue("@LoggedOutTime", DateTime.Now.ToString("HH:mm")); 
+0

@D Stantley - 不應該是int id =(int)cmd.ExecuteScalar();並在註銷方法如何調用id,因爲它給我錯誤的「名稱id」在當前上下文中不存在「? – bucketblast 2013-03-26 13:39:12

+0

@bucketblast(修復了鑄造錯誤),您需要決定_how_以保存該ID。由於這些似乎在按鈕處理程序中,最簡單的方法是將其存儲爲表單的屬性。隨着您的應用程序(以及您的編程技巧)成熟,您會發現更好的方式,但將其作爲表單的屬性將會起作用。 – 2013-03-26 13:43:54

+0

行 - 我沒有int id = 0;在那個方法,但我仍然得到相同的錯誤。我會在頂部更新。 – bucketblast 2013-03-26 13:47:17

相關問題