Почему эта функция завершается с ошибкой "Произошла ошибка при разборе запроса. [Номер строки токена, смещение строки токена,, Токен в ошибке,,]"?
Этот код:
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
на ранней стадии (например, когда программа запускается), так что вы уже знаете, что столбец действителен до начала ваших транзакций.