我有一个记录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++;
}
答案 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是这个限制,你的代码似乎没有考虑到这一点。