0

ID、名前、TimeIn、TimeOut を記録するプログラムがあります。カードの最初のスキャンで ID、名前、時間を記録し、2 回目のスワイプでタイムアウト列に追加します。3回目のスワイプで別の「TimeIn」列を追加しようとしているので、「TimeIn + Unique Number」を挿入しようとしましたが、引用符のために変数を取得しません。

これが私のコードです:

    private void SignIn_Time(OleDbCommand updateCmd, OleDbConnection OLEDB_Connection, Object varName, Object varID, String varTime)
    {
        object varTimeColumn;
        varTimeColumn = "TimeIn" + GetUniqueNumber();

        updateCmd.CommandText = "ALTER TABLE TestDB ADD COLUMN varTimeColumn TEXT";
        updateCmd.CommandText = "INSERT INTO TestDB (varTimeColumn) VALUES (@TIMEIN)";
        updateCmd.Parameters.AddWithValue("@TIMEIN", varTime);
        OLEDB_Connection.Open();
        updateCmd.Connection = OLEDB_Connection;
        updateCmd.ExecuteNonQuery();
        OLEDB_Connection.Close();
    }

    static int counter;
    public static int GetUniqueNumber()
    {
        return counter++;
    }
4

1 に答える 1

1

上記のコードには 2 つのエラーがあり
ます。 Access Jet エンジンは、2 つの連結されたコマンドをサポートしていません。各コマンドを単独で送信する必要があります。

もう 1 つの問題は、列名を表すために使用される変数名です。コマンド内に変数を埋め込むことはできません。その値を入力する必要があります。そのためには、文字列連結しか使用できません。

private void SignIn_Time(OleDbCommand updateCmd, OleDbConnection OLEDB_Connection, 
                         Object varName, Object varID, String varTime)
{
    try
    {
        OLEDB_Connection.Open();
        string varTimeColumn = "TimeIn" + GetUniqueNumber().ToString();
        updateCmd.Connection = OLEDB_Connection;
        updateCmd.CommandText = "ALTER TABLE TestDB ADD COLUMN " + varTimeColumn + " TEXT";
        updateCmd.ExecuteNonQuery();

        updateCmd.CommandText = "INSERT INTO TestDB (varTimeColumn) VALUES (@TIMEIN)";
        updateCmd.Parameters.AddWithValue("@TIMEIN", varTime);
        updateCmd.ExecuteNonQuery();
        OLEDB_Connection.Close();
    }
    catch(Exception ex)
    {
        if(OLEDB_Connection.State == ConnectionState.Open)
            OLEDB_Connection.Close();

        // Perhaps in debug you could do something here with the exception like a log message
        // or rethrow the execption to be handled at an upper level...
        throw;
    }
}

static int counter;
public static int GetUniqueNumber()
{
    return counter++;
}

またtry/catch、例外が発生した場合に接続を閉じないため、コードの周りにブロックを使用することをお勧めします。より良いアプローチはusing ステートメントである必要がありますが、上記のコードからは、このパターンを実装する方法が明確ではありません

上記の@Corakからのコメントに完全に同意します。提案されたソリューションは、論理的な要件に対する唯一の論理的アプローチです。また、Access テーブルには、テーブルに追加できる列の最大数に制限があることに注意してください。255 がこの制限であり、コードはこれを考慮していないようです。

Microsoft Access 2010 の仕様

于 2013-11-29T10:10:21.353 に答える