duh_si 569 / 169 / 22 Регистрация: 18.10.2012 Сообщений: 903 |
||||
1 |
||||
11.07.2014, 10:50. Показов 1383. Ответов 14 Метки нет (Все метки)
День добрый.
Пишет: Ошибка синтаксиса в инструкции UPDATE Подскажите пожалуйста в чем причина…
0 |
26788 / 14467 / 3192 Регистрация: 28.04.2012 Сообщений: 15,782 |
|
11.07.2014, 11:24 |
2 |
Самая вероятная причина это пустое (NULL) значение в одной из числовых переменных. Тогда собранная строка имеет знак равенства за которым следует запятая. Конечно, это ошибка.
1 |
569 / 169 / 22 Регистрация: 18.10.2012 Сообщений: 903 |
|
11.07.2014, 11:29 [ТС] |
3 |
mobile, тоже очень частый — какие-то переменные имеют текстовый тип и должны окаймляться апострофами. с этим уже столкнулся, это поправил все mobile, причина это пустое (NULL) вы скорее всего правы в этом, подскажите как это можно обработать ?
0 |
mobile 26788 / 14467 / 3192 Регистрация: 28.04.2012 Сообщений: 15,782 |
||||
11.07.2014, 11:32 |
4 |
|||
Решение
как это можно обработать ? Пример для поля Количество
Такая запись, при пустом значении запишет NULL в собранное SQL-выражение.
1 |
duh_si 569 / 169 / 22 Регистрация: 18.10.2012 Сообщений: 903 |
||||
11.07.2014, 11:33 [ТС] |
5 |
|||
вот так примерно все выглядит
0 |
1266 / 448 / 129 Регистрация: 21.03.2013 Сообщений: 1,210 |
|
11.07.2014, 12:10 |
6 |
надо всего лишь собранную строку распечатать (Debug.Print) подскажите как дебугом пользоваться? пожалуйста или где почитать доходчиво можно
0 |
shanemac51 Модератор 11465 / 4713 / 759 Регистрация: 07.08.2010 Сообщений: 13,686 Записей в блоге: 4 |
||||
11.07.2014, 12:11 |
7 |
|||
а должен выглядеть примерно так
хотя будет ерунда, если данного номера нет или их несколько
2 |
8791 / 5669 / 579 Регистрация: 27.03.2013 Сообщений: 19,139 |
|
11.07.2014, 14:40 |
8 |
Возможно вопрос по теме. Миниатюры
0 |
8791 / 5669 / 579 Регистрация: 27.03.2013 Сообщений: 19,139 |
|
11.07.2014, 15:13 |
9 |
На все другие ремы навожу, такого нет, а у вас не пропадает. Добавлено через 28 минут
0 |
duh_si 569 / 169 / 22 Регистрация: 18.10.2012 Сообщений: 903 |
||||
15.07.2014, 12:29 [ТС] |
10 |
|||
подскажите как можно обработать переменные в которых дата,
ругается на запрос update Несоответствие типов данных в выражении условия отбора.
0 |
shanemac51 Модератор 11465 / 4713 / 759 Регистрация: 07.08.2010 Сообщений: 13,686 Записей в блоге: 4 |
||||
15.07.2014, 14:50 |
11 |
|||
но сохранить запись нужно с этими пустыми полями сие не заметила, но и без этого орехов много
0 |
569 / 169 / 22 Регистрация: 18.10.2012 Сообщений: 903 |
|
15.07.2014, 15:23 [ТС] |
12 |
shanemac51, использую ваш код, Миниатюры
0 |
Модератор 11465 / 4713 / 759 Регистрация: 07.08.2010 Сообщений: 13,686 Записей в блоге: 4 |
|
15.07.2014, 15:38 |
13 |
у меня вашей базы нет —проверить не смогла (а2007) может дело в том, что у вас нет какой-то даты
0 |
569 / 169 / 22 Регистрация: 18.10.2012 Сообщений: 903 |
|
15.07.2014, 15:57 [ТС] |
14 |
shanemac51, может дело в том, что у вас нет какой-то даты в том то и дело, поля с датами остаются пустыми ( эти поля пользователю не обязательно сразу нужно заполнять, как нужно будет он заполнит ) , соответственно и в переменных пусто, а когда UPDATE делаю, код ругается что в переменных нет ничего, а мне нужно чтобы он не обращал на это внимание, просто тупо перезаписывал пустоту
0 |
shanemac51 Модератор 11465 / 4713 / 759 Регистрация: 07.08.2010 Сообщений: 13,686 Записей в блоге: 4 |
||||
15.07.2014, 16:42 |
15 |
|||
проверка на пустые поля
1 |
I was working in C# form application with an MS-Access mdb
database. I have a database in which I have a table Customers
with two columns CustomerId
And Balance
. Both columns are of integer
datatype.
Error I was getting is
System.Data.OleDb.OleDbException: Syntax error in UPDATE statement.
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
at xml_and_db_test.Form1.button1_Click(Object sender, EventArgs e) in G:my DocumentsVisual Studio 2008Projectsxml_and_db_testxml_and_db_testForm1.cs:line 45
Codes I have tried till now are
try
{
OleDbConnection con = new
OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database_for_kissan_Pashu_AhaR_Bills.mdb");
int balance = Convert.ToInt32(textBox2.Text);
int id = Convert.ToInt32(textBox1.Text);
// int recordnumb = int.Parse(recordTextBox.Text);
// OleDbConnection oleDbConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Checkout-1\Documents\contact.accdb");
OleDbCommand update = new OleDbCommand("UPDATE Customers SET Balance ='" + balance + "', WHERE id =" + id + " ", con);
con.Open();
update.ExecuteNonQuery();
con.Close();
// string queryText ="UPDATE Customers SET Balance = ?, where CustomerId = ?;";
//string queryText =" 'UPDATE Customers SET Balance =' " + balance+ " ' WHERE CustomerId= ' " + id + " ' " ;
//OleDbCommand cmd = new OleDbCommand(queryText, con);
//cmd.CommandType = CommandType.Text;
//cmd.Parameters.AddWithValue("@balance", Convert.ToInt32(textBox2.Text));
//cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(textBox1.Text));
//cmd.Parameters.Add("Balance", OleDbType.Integer).Value = Convert.ToInt32(textBox2.Text);
//cmd.Parameters.Add("CustomerId", OleDbType.Integer).Value = Convert.ToInt32(textBox1.Text);
//con.Open(); // open the connection
////OleDbDataReader dr = cmd.ExecuteNonQuery();
//int yy = cmd.ExecuteNonQuery();
//con.Close();
}
catch (Exception ex)
{
string c = ex.ToString();
MessageBox.Show(c);
}
//try
//{
// OleDbConnection con = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = G:\my Documents\Visual Studio 2008\Projects\xml_and_db_test\xml_and_db_test\bin\Debug\database_for_kissan_Pashu_AhaR_Bills.mdb");
// string queryText ="UPDATE Customers SET Balance = ?, where CustomerId = ?;";
// OleDbCommand cmd = new OleDbCommand(queryText, con);
// cmd.CommandType = CommandType.Text;
// //cmd.Parameters.AddWithValue("@balance", Convert.ToInt32(textBox2.Text));
// //cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(textBox1.Text));
// cmd.Parameters.Add("Balance", OleDbType.Integer).Value = Convert.ToInt32(textBox2.Text);
// cmd.Parameters.Add("CustomerId", OleDbType.Integer).Value = Convert.ToInt32(textBox1.Text);
// con.Open(); // open the connection
// //OleDbDataReader dr = cmd.ExecuteNonQuery();
// int yy = cmd.ExecuteNonQuery();
// con.Close();
//}
//catch (Exception ex)
//{
// string c = ex.ToString();
// MessageBox.Show(c);
//}
//string connetionString = null;
//OleDbConnection connection;
//OleDbDataAdapter oledbAdapter = new OleDbDataAdapter();
//string sql = null;
//connetionString ="Provider = Microsoft.Jet.OLEDB.4.0; Data Source = G:\my Documents\Visual Studio 2008\Projects\xml_and_db_test\xml_and_db_test\bin\Debug\database_for_kissan_Pashu_AhaR_Bills.mdb;";
//connection = new OleDbConnection(connetionString);
//sql ="update Customers set Balance ='1807' where CustomerId ='1'";
//try
//{
// connection.Open();
// oledbAdapter.UpdateCommand = connection.CreateCommand();
// oledbAdapter.UpdateCommand.CommandText = sql;
// oledbAdapter.UpdateCommand.ExecuteNonQuery();
// MessageBox.Show("Row(s) Updated !! ");
// connection.Close();
//}
//catch (Exception ex)
//{
// MessageBox.Show(ex.ToString());
//}
some codes are In comments and some are with every method i’m getting the same error.
I am displaying a data in datagridview and I am trying to update the database from datagridview. So I am using OleDbCommandBuilder to generate the update command. I get «Syntax error in update statement» when clicking on update button.
Here is my code:
private void listBox9_SelectedValueChanged(object sender, EventArgs e)
{
AppDomain.CurrentDomain.SetData("DataDirectory", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|\Trip Sheet Management System\WABCO.mdb");
sql ="SELECT ID,[TRIP COST] FROM TMSDETAILS";
dataAdapter = new OleDbDataAdapter(sql, connection);
dataTable = new DataTable();
bindingSource = new BindingSource();
connection.Open();
dataAdapter.Fill(dataTable);
bindingSource.DataSource = dataTable;
dataGridView1.DataSource = bindingSource;
connection.Close();
}
private void button8_Click(object sender, EventArgs e)
{
commandBuilder = new OleDbCommandBuilder(dataAdapter);
try
{
dataAdapter.Update(dataTable);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
When I click on update button, I get error in MessageBox saying «Syntax error in update statement»
Field 1: ID — Autonumber, primary key
Field 2: TRIP COST — Number
asked Feb 3, 2015 at 15:42
4
Guys I found the answer by myself.
The error occurred because the field name contains a space i.e TRIP COST.
just add the two line next to command builder statement.
commandBuilder.QuotePrefix = «[«;
commandBuilder.QuoteSuffix = «]»;
Here is the edited code.
private void listBox9_SelectedValueChanged(object sender, EventArgs e)
{
AppDomain.CurrentDomain.SetData("DataDirectory", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|\Trip Sheet Management System\WABCO.mdb");
sql ="SELECT ID,[TRIP COST] FROM TMSDETAILS";
dataAdapter = new OleDbDataAdapter(sql, connection);
dataTable = new DataTable();
bindingSource = new BindingSource();
connection.Open();
dataAdapter.Fill(dataTable);
bindingSource.DataSource = dataTable;
dataGridView1.DataSource = bindingSource;
connection.Close();
}
private void button8_Click(object sender, EventArgs e)
{
commandBuilder = new OleDbCommandBuilder(dataAdapter);
commandBuilder.QuotePrefix ="[";
commandBuilder.QuoteSuffix ="]";
try
{
dataAdapter.Update(dataTable);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Hope it helps others.
answered Feb 4, 2015 at 3:44
Raize AhamedRaize Ahamed
2852 gold badges4 silver badges20 bronze badges
1
- Remove From My Forums
-
Вопрос
-
Элементарный запрос:
«UPDATE Client SET BalancePersonalAccount = 20,3 WHERE ID = 531707020»
Не обновляется, т.к 20,3 (запятая). Ставлю точку (20.3) — все работает.
Как от этого избавиться?
Aссess стоит 2016, но база — Aссess 2000
Язык в Windows — русский.
Разделитель целой и дробной части — запятая.
Ответы
-
Никаких грабель, ведь это не строка в каком то локализованном формате, а float/double (или другой нужный тип). Если это переменная то присвойте ее значение без преобразования в строку.
Использование параметров разом излечивает от проблем глобализации/локализации (это то что у вас), а заодно избавляет от атак класса SQL Injection. Так же повышается производительность, ведь нет необходимости преобразовывать числа
в строки и потом обратно в числа (на удивление дорогая операция). Так же при большом числе операций можно использовать один подготовленный запрос меняя каждый раз лишь значения параметров, это может поднять скорость на порядок.Передача значений в запросах в общем случае является грубой ошибкой с серьезными проблемами и опасными последствиями.
Что до SQL то он возьмет формат чисел который установлен на сервере (а не на клиенте). Если настройки на клиенте и сервере разные (как скорее всего у вас) то начинаются проблемы с форматами если передавать их в строках запросов.
This posting is provided «AS IS» with no warranties, and confers no rights.
-
Предложено в качестве ответа
4 января 2017 г. 8:51
-
Помечено в качестве ответа
Maksim MarinovMicrosoft contingent staff, Moderator
9 января 2017 г. 7:58
-
Предложено в качестве ответа
-
Не хотел в этой простенькой программе замораживаться с параметрами, но видно придется.
Я, по глупости своей, забыл, что в параметр передается значение (не так часто с БД работаю). В любом случае — спасибо.
Реализую — отпишусь. Может еще кому поможет.
public Single Update_Object_BalancePersonalAccount(Int32 objectID) {
Single s = Calculate_ObjectBalancePersonalAccount(objectID);
string sql = «UPDATE [Object] SET [Object].BalancePersonalAccount = @bpa WHERE [Object].ID = @id»;OleDbCommand cmd = new OleDbCommand(sql, _connection);
cmd.Parameters.AddWithValue(«@bpa», SqlDbType.Money);
cmd.Parameters[«@bpa»].Value = s;cmd.Parameters.AddWithValue(«@id», SqlDbType.Int);
cmd.Parameters[«@id»].Value = objectID;try {
_connection.Open();
cmd.ExecuteScalar();
} catch(Exception ex) {
Console.WriteLine(ex.Message);
} finally { _connection.Close(); }
return s;
}-
Изменено
dav_tag
4 января 2017 г. 11:20 -
Помечено в качестве ответа
Maksim MarinovMicrosoft contingent staff, Moderator
9 января 2017 г. 7:58
-
Изменено
#c# #visual-studio-2010 #syntax-error #ms-access-2010
Вопрос:
Я столкнулся с синтаксической ошибкой в инструкции UPDATE при обновлении пароля в базе данных Access на C#:
protected void Button1_Click(object sender, EventArgs e)
{
OleDbConnection con = new OleDbConnection();
con.ConnectionString ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
Server.MapPath("~/Database/registration.accdb");
con.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText =
"UPDATE into userdata(password)values('" TextBox1.Text "') where id=@id";
cmd.ExecuteNonQuery();
con.Close();
Response.Write("alert('Password Reset Successfully done');");
}
Комментарии:
1. Итак, в чем именно заключается ваш вопрос?
2. Где синтаксическая ошибка?
3. Вам нужно узнать о синтаксисе инструкции UPDATE SQL…
UPDATE INTO
это неправильный синтаксис4. И хранение пароля в базе данных-это полное «нет-нет». НИКОГДА, НИКОГДА, НИКОГДА НЕ храните незашифрованный пароль (даже не зашифрованный).
5. пожалуйста, используйте параметризованные запросы — построение SQL-запросов путем объединения и т. Д.-Это путь к катастрофе. это не только источник многих трудных для отладки синтаксических ошибок, но и широкие открытые ворота для атак с использованием SQL-инъекций .
Ответ №1:
Это потому, что вы SQL Query
неверны, вы не так обновляете данные в своей базе данных. Это должно быть так:
query ="Update [tableName] SET [ColumnName] ='Values', [ColumnName1] ='Values2',...";
Вы должны изучить, по крайней мере, основы синтаксиса SQL, более подробная информация здесь
А также вам не следует объединять свой запрос, так как он станет уязвимым для SQL Injection attack
, вы должны, по крайней мере, использовать Parameterized Query
OleDbConnection con = new OleDbConnection();
con.ConnectionString ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
Server.MapPath("~/Database/registration.accdb");
con.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText =
"UPDATE yourTableName SET [yourColumnName] = @YourFirstValue, [secondColumnName] = @YourSecondValue WHERE [columnKey] = @ID"
cmd.Parameters.AddWithValue("@YourFirstValues", textbox1.Text);
cmd.Parameters.AddWithValue("@YourSecondValue ", textbox2.Text);
cmd.Parameters.AddWithValue("@ID", textbox3.Text);
cmd.ExecuteNonQuery();
con.Close();
Response.Write("alert('Password Reset Successfully done');");
Комментарии:
1. @user9938 Текстовое поле не может иметь значение
null
. И значение empty будет работать нормально, несмотря на ваше утверждение.
Ответ №2:
вы должны исправить свой запрос
"UPDATE userdata SET password=@password where id=@id";
и добавьте новые строки перед cmd.Запрос на выполнение()
cmd.Parameters.AddWithValue("@id", id);
cmd.Parameters.AddWithValue("@password", TextBox1.Text);
Комментарии:
1. Вероятно, это сработает, но: НИКОГДА не храните пароли в базе данных. Вместо этого используйте соленые хэши.