2013-03-24 78 views
0

搁置盐和散列辩论。如果你知道答案,请回复。已与其基础RCW分离的COM对象无法使用?

我想创建一个方法,用户输入他们的凭据与日期和时间登录和登出时自动记录。

我有两个问题

问题1 - 我创建了一个简单的方法,只是登录和注销。当我包含日期和时间代码时,我注意到这些地方记录并存储了所有用户。我目前有两个用户。因此,如果一个用户登录日期和时间被记录并为其他用户加盖邮票。

问题2 - 第二个问题是,当主题标题显示Update Update命令参数与Select相同时,出现错误消息。

如果有人可以帮助我,我会感激两个问题。希望这只是一个小问题?如果省略日期和时间,我将不胜感激,如果有人可以帮助我的多登录功能。

Access 2003〜两张表。表1 - 命名LoginTable表2 - 命名LoginLogTable

LoginTable

字段名数据类型

UserName Text 
Password Text 

LoginLogTable 
FieldName  DataType 
UserNameID Text 
UserName  Text 
LoggedIn  Date/Time 
LoggedInTime Date/Time  



private void btnLogin_Click(object sender, EventArgs e) 
{ 
    using (var command = myCon.CreateCommand()) 
     { 
      command.CommandText = "select UserName, Password from LoginTable where WHERE STRCOMP(UserName, @UserName,0) = 0 AND STRCOMP(Password, @Password,0)=0"; 
      command.Parameters.AddWithValue("UserName", (txtUserName.Text)); 
      command.Parameters.AddWithValue("Password", (txtPassword.Text)); 
      myCon.Open(); 

      var reader = command.ExecuteReader(); 
      { 
       if (reader.HasRows) 
       { 
        MessageBox.Show("Login Successful"); 
        Form2 frm = new Form2(); 
        frm.Show(); 
        while (reader.Read()) 
        { 
         txtUserName.Text = reader["UserName"].ToString(); 
         txtPassword.Text = reader["Password"].ToString(); 
        } 

        OleDbCommand cmd = new OleDbCommand(); 
        cmd.Connection = myCon; 

        cmd.CommandText = "UPDATE [LoginLogTable] SET [LoggedInDate] = ?, [LoggedInTime] = ?"; 
         cmd.Parameters.AddWithValue("@LoggedInDate", DateTime.Now.ToShortDateString()); 
        cmd.Parameters.AddWithValue("@LoggedInTime", DateTime.Now.ToString("HH:mm")); 
        cmd.ExecuteNonQuery(); 
        myCon.Close(); 

       } 
      else MessageBox.Show("Login Falied"); 
      } 

     } 
      myCon.Close(); 
      myCon.Close(); 

}

+0

出于好奇,你为什么要关闭连接3次? – 2013-03-24 19:01:28

+0

@M帕特尔它应该关闭两次?不应该?我现在正在关注打开和关闭连接。 – bucketblast 2013-03-24 19:51:23

回答

1

您的update查询中没有任何条件,因此它将更新表中的所有记录。添加条件以仅更新单个记录。我不知道你在你的表格,但这样的事情:

cmd.CommandText = "UPDATE [LoginLogTable] SET [LoggedInDate] = ?, [LoggedInTime] = ? where UserName = ?"; 
cmd.Parameters.AddWithValue("LoggedInDate", DateTime.Now.ToShortDateString()); 
cmd.Parameters.AddWithValue("LoggedInTime", DateTime.Now.ToString("HH:mm")); 
cmd.Parameters.AddWithValue("UserName", txtUserName.Text); 

你应该关闭并执行第二命令之前处理第一数据读取器和命令。

+0

谢谢。我有2个开放连接和3个关闭连接,所以没有任何意义。整理出来。正如你所指出的,我忘了也包括where子句。 – bucketblast 2013-03-24 20:29:17

+0

为了补充说明,我认为你也应该在“使用”语句之间放置数据库连接。这将确保您的连接也被关闭并处理,而不必在其上显式调用Close()。 – 2013-03-24 21:40:22

0

我想你在LoginLogTable和更新表需要用户名栏像这样的东西

UPDATE [LoginLogTable] SET [LoggedInDate] = ?, [LoggedInTime] = ? WHERE UserName = 'YourUserName'. 

第二,我相信你在这里不需要读者。您可以使用ExecuteScalar来代替Reader。第二个命令无法运行,因为Reader已打开状态。

+0

谢谢你丹尼尔我忘了包括where子句。 – bucketblast 2013-03-24 20:30:04

相关问题