0

我有一个记录 ID、名称、TimeIn、TimeOut 的程序。在第一次扫描卡时,它会记录 id、name 和 timein,然后在第二次刷卡时它会添加到超时列。我试图让它在第三次滑动时添加另一个“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

上面的代码有两个错误:
Access Jet Engine 不支持两个串联的命令。您应该单独发送每个命令。

另一个问题是用于表示列名的变量名。您不能在命令中嵌入变量。您应该输入它的值,为此,您只能使用字符串连接。

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 的评论。建议的解决方案是满足您的逻辑要求的唯一合理方法。另外,请记住,访问表对可以添加到表中的最大列数有限制。255 是这个限制,您的代码似乎没有考虑到这一点。

Microsoft Access 2010 规范

于 2013-11-29T10:10:21.353 回答