通过应用程序向访问数据库添加唯一列名称 - C#

时间:2013-11-29 09:58:39

标签: c# ms-access datetime oledb updatecommand

我有一个记录ID,Name,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++;
    }

1 个答案:

答案 0 :(得分:1)

上述代码中有两个错误:
Access Jet引擎不支持两个连接命令。您应该自己发送每个命令。

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

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 statement,但是从上面的代码中不清楚如何实现这种模式

我完全同意@Corak上面的评论。建议的解决方案是满足您的逻辑要求的唯一理由方法。此外,请记住,访问表对可添加到表中的最大列数有限制。 255是这个限制,你的代码似乎没有考虑到这一点。

Microsoft Access 2010 specifications