Добавить уникальное имя столбца для доступа к базе данных через приложение - 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 - это предел, и ваш код, похоже, не учитывает это.

Спецификации Microsoft Access 2010

Другие вопросы по тегам