Access 2003
VS 2010 c#
题目说我有问题。这与我之前问的问题有关。我希望mod将与这个线程,但我不确定。
Martin Parkin建议在使用@@Identity
与c#和MS-Access时不要关闭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 . Stanley和Gord Thompson。
@ID
变量并不像您认为的那样在数据库中持续存在。当连接关闭时(可能更快),它将超出作用域。我建议您将新标识存储在应用程序中:
假设这些按钮处理程序是表单上的方法,您可以将ID存储为表单的属性:
// somewhere in the form definition:
private int ID {get; set;}
...
cmd.CommandText = "SELECT @@IDENTITY";
int id = (int)cmd.ExecuteScalar();
this.ID = id;
然后在Logout方法中使用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"));