Может кто-нибудь объяснить смысл этого исключения? Строка подключения, имя таблицы, синтаксис запроса верны

SqlCeCommand cmd = new SqlCeCommand("INSERT INTO tbl_AStatus (Asset Status,Remarks) VALUES (@a, @b)", Login.sqlConn);
cmd.Parameters.AddWithValue("@a", txtAssetStatus.Text);
cmd.Parameters.AddWithValue("@b", txtRemarks.Text);
int a = cmd.ExecuteNonQuery();
MessageBox.Show(a.ToString());

Показано исключение:

Произошла ошибка при синтаксическом анализе запроса. [Номер строки токена = 1, смещение строки токена = 32, токен с ошибкой = статус]


person Shreyas    schedule 27.11.2014    source источник
comment
плохая идея иметь место в имени столбца [Asset Status], если оно у вас действительно есть.   -  person bansi    schedule 27.11.2014
comment
Вы должны проверить Can мы уже прекращаем использовать AddWithValue()? и прекращаем использовать .AddWithValue() - это может привести к неожиданным и удивительным результатам...   -  person marc_s    schedule 27.11.2014


Ответы (1)


Если ваше имя таблицы или имена столбцов содержат пробелы, вам нужно использовать их с квадратными скобками, например [Asset Status]. Но это не рекомендуется. Было бы лучше изменить имя столбца на что-то другое, если вы можете.

Прочтите: Соглашения об именах баз данных, таблиц и столбцов?

Также используйте using оператор для удаления подключений к базе данных и объектов.

using(SqlCeCommand cmd = Login.sqlConn.CreateCommand())
{
   cmd.CommandText = "INSERT INTO tbl_AStatus ([Asset Status],Remarks) VALUES (@a, @b)";
   cmd.Parameters.Add("@a", SqlDbType.NVarChar).Value = txtAssetStatus.Text;
   cmd.Parameters.Add("@b", SqlDbType.NVarChar).Value = txtRemarks.Text;
   // I assume your column types are NVarChar
   Login.sqlConn.Open();
   int a = cmd.ExecuteNonQuery();
   MessageBox.Show(a.ToString());
}

И не используйте метод AddWithValue. Иногда это может генерировать неожиданные результаты. Используйте метод SqlParameterCollection.Add и его перегрузки.

Прочтите: Можем ли мы прекратить уже используете AddWithValue()?

person Soner Gönül    schedule 27.11.2014
comment
Спасибо Сонер за помощь. Теперь он показывает результат ExecuteNonQuery() как 1, но без изменений в базе данных. - person Shreyas; 27.11.2014
comment
@Shreyas Ты уверен? Если ExecuteNonQuery возвращает 1, он должен вставиться в вашу базу данных. Вы пробовали этот запрос в вашем менеджере баз данных? Он успешно вставляется туда? - person Soner Gönül; 27.11.2014
comment
@Shreyas Хорошо, вы используете для этого файл локальной базы данных? Попробуйте подключить его в меню обозревателя объектов Sql Server Visual Studio и попробуйте выполнить этот запрос в локальном файле. - person Soner Gönül; 27.11.2014
comment
Спасибо огромное. Сейчас он работает нормально, это было из-за медленной машины. Большое спасибо. Это было очень нужно. Предложения - person Shreyas; 27.11.2014