Добавить уникальное имя столбца для доступа к базе данных через приложение - C#
У меня есть программа, которая записывает идентификатор, имя, время, время. При первом сканировании карты записывается идентификатор, имя и время, а затем при втором пролистывании добавляется столбец времени ожидания. Я пытаюсь заставить его добавить еще один столбец "TimeIn" при третьем пролистывании, поэтому я попытался заставить его вставить "TimeIn + Уникальный номер", но он не получает переменную из-за кавычек.
Вот мой код:
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 ответ
В приведенном выше коде есть две ошибки:
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
блокируйте код, потому что, в случае исключений, вы не закрываете соединение. Лучшим подходом должно быть использование оператора, но из приведенного выше кода не ясно, как реализовать этот шаблон
Я полностью согласен с комментарием от @Corak выше. Предлагаемое решение является единственным обоснованным подходом к вашим логическим требованиям. Также помните, что таблица доступа имеет ограничения по максимальному количеству столбцов, которые можно добавить в таблицу. 255 - это предел, и ваш код, похоже, не учитывает это.