0

アクセス2003

VS 2010 C#

件名のタイトルにあるように、私は問題を抱えています。これは、私が以前に尋ねた質問、ここに関連しています。このスレッドでmodが問題ないことを願っていますが、よくわかりません。

@@IdentityMartin Parkinは、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);

DStanleyとGordThompsonに感謝します。

4

1 に答える 1

3

変数は、@IDあなたが思っているようにデータベースに保持されません。接続が閉じられると(おそらくもっと早く)スコープから外れます。代わりに、アプリケーション内に新しい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"));
于 2013-03-26T13:35:29.407 に答える