Почему эта функция завершается с ошибкой "Произошла ошибка при разборе запроса. [Номер строки токена, смещение строки токена,, Токен в ошибке,,]"?

Этот код:

public bool IsValidColumn(string tableName, string columnName)
{
    //return true;// <-- when I uncomment this, I don't get the err msg (but I don't know whether it's a valid column or not, either)
    bool validColumn = false;
    string tblQuery = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName AND COLUMN_NAME = @columnName";
    checkConnection();
    try
    {
        SqlCeCommand cmd = objCon.CreateCommand();
        cmd.CommandText = tblQuery;
        SqlCeParameter tblNameParam = new SqlCeParameter("@tableName", SqlDbType.NVarChar, 128);
        tblNameParam.Value = tableName;
        cmd.Parameters.Add(tblNameParam);
        SqlCeParameter colNameParam = new SqlCeParameter("@columnName", SqlDbType.NVarChar, 128);
        colNameParam.Value = tableName;
        cmd.Parameters.Add(colNameParam);
        //int i = (int)cmd.ExecuteScalar();
        int i = 0;
        object obj = cmd.ExecuteScalar();
        if ((obj != null) && (obj != DBNull.Value)) 
        {
            i = Int32.Parse(obj.ToString());
            validColumn = i > 0;
        } 
        else 
        {
            MessageBox.Show("NULL returned from ExecuteScalar. Remove this line.");
        }
    }
    catch (SqlCeException sqlceex)
    {
        return false; 
    }
    catch (Exception ex)
    {
        return false;
    }
    return validColumn;
}

... был адаптирован из / на основе более раннего ответа здесь: Как я могу определить, существует ли столбец в таблице SQL Server CE с C#?

И все же, это заставляет меня получить сообщение "Произошла ошибка при синтаксическом анализе запроса. [Номер строки токена, смещение строки токена, Токен в ошибке,,]" (на что я жаловался здесь: Почему произошла ошибка при анализе этого DDL и почему движок не может быть более точным в определении его местонахождения?

Анализатор DDL в SQL Server CE очень требователен, но скрытен в том, в чем он находит ошибку).

В моих попытках разобраться в причинах этой ошибки, я на самом деле реорганизовал унаследованный код довольно много (выбросив из холодильника много прогорклых спагетти), так что это не было пустой тратой времени, но теперь я обнаружил, что причиной этого сообщения об ошибке было что-то в коде выше. Итак, вопрос: как я могу определить, является ли столбец действительным, не генерируя сообщение об ошибке?

1 ответ

Решение

Из ваших комментариев я вижу это сообщение:

SQL Server CE не поддерживает параллельные транзакции.

Я предполагаю, что ваш код вызывает эту проверку, пока вы находитесь внутри транзакции. Возможно, вам придется выполнять проверку ошибок отдельно от транзакций.

Некоторое время я использовал транзакции, потом понял, что они не нужны для простых операций чтения / записи в базу данных... поскольку я не имел дело с банковским учреждением. Держу пари, что было бы безопасно удалить ваши заявления о транзакциях, но это только побочные комментарии.

Я заметил, что многие из вашего кода используют эти специализированные операторы:

  • checkConnection(),
  • objCon.CreateCommand() а также
  • isValidField,

Они действительно тебе помогают?

Сколько мест вы называете эти процедуры?

Сообщение об ошибке звучит так, как будто вы уже начали другую транзакцию где-то еще в вашем коде до того, как вы позвонили IsValidColumn,

Возможно, вы могли бы изменить код, чтобы проверить IsValidColumn на ранней стадии (например, когда программа запускается), так что вы уже знаете, что столбец действителен до начала ваших транзакций.

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