Ошибка синтаксиса в инструкции update access

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 Documents\Visual Studio 2008\Projects\xml_and_db_test\xml_and_db_test\Form1.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.

  • Remove From My Forums
  • Question

  • In this code I use an Access database…
    OleDbDataReader rdr = acmd.ExecuteReader();

    rdr.Close();
    The code works fine up to this point. I successfully read from the Clients and WPClients tables in the database.
    Right after that I set a different command…
    q = «Update Clients Set Found = ‘200550’ Where ID = ‘100020’»;
    acmd.CommandText = q;
    acmd.ExecuteNonQuery();
    This throws «Syntax error in UPDATE statement.»
    The connection to the Access database is still open.

    However, when I open the .mdb file in Access and paste the exact same command into the SQL view of a query, it runs fine.

    Why can’t I run the update statement from C#?

Answers

  • Have you tried to ‘bracket’ the fields?

    «Update [Clients] Set [Found]=’200550′ where [ID]=’100020′;»

    If that doesn’t work, you can also parameterize your sql:

    q = «Update [Clients] set [Found]=? where [ID]=?);

    OleDbParameters[] parameters =
    {
      new OleDbParameter(«?», «2005500»),
      new OleDbParameter(«?», «100020»)
    };

    acmd.CommandText = q;
    acmd.Parameters.AddRange(parameters);

    I like to parameterize any strings that I use in my queries.  This ensures that they are handled correctly without having to be parsed.


    public enum Answers
    {
    Everything = 0x2A
    }

    • Marked as answer by

      Tuesday, November 3, 2009 6:07 PM

I have been working on this issue for ages! I have an MSAccess 2007 db and I am using Visual Studio 2010 and Visual Basic to write an application that reads and writes from the database. The read works just fine but when I try and write an updated password back into the database, it fails. Initially I had just a plain ‘Syntax Error’ which wasn’t that helpful, but with a bit of research I noted that access databases seem to have an issue with columns called password. I renamed that and tried again, now I get this error when the

da.Update(ds,»All_Users»)

command is executed.

The full error message from VS is :
Syntax error (missing operator) in query expression '((ID = ?) AND ((? = 1 AND Forename IS NULL) OR (Forename = ?)) AND ((? = 1 AND Surname IS NULL) OR (Surname = ?)) AND ((? = 1 AND User_Level IS NULL) OR (User_Level = ?)) AND ((? = 1 AND Last Logon IS NULL) OR (Last Logon = ?)) AND ((? = 1 AND Allow IS NU'.

My code is as follows:

Private Sub btnSave_Click(snder as System.Object, e As System.EventArgs) Handles btnSave.Click
    Dim Con As New OleDb.OleDbConnection
    Dim ConString As String
    Dim ds As New DataSet
    Dim da As OleDb.OleDbDataAdapter
    Dim Sql As String = "SELECT * FROM tblUsers"
    '
    ConString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
        Application.StartupPath & "\Data\Users.accdb;Jet OLEDB:Database Password=---------;"
    Con.ConnectionString = ConString
    Con.Open()
    da = New OleDb.OleDbDataAdapter(Sql, Con)
    da.Fill(ds, "All_Users")
    'Now loop through the records until you find the one for this user
    For i = 0 To ds.Tables("All_Users").Rows.Count - 1
        If ds.Tables("All_Users").Rows(i).Item(0).ToString = CurrentUser.ID Then
            ds.Tables("All_Users").Rows(i).Item(6) = txtConfirmPassword.Text
        End If
    Next
    CurrentUser.Password = txtConfirmPassword.Text
    '
    Dim cb As New OleDb.OleDbCommandBuilder(da)
    da.Update(ds, "All_Users")
    '
    Con.Close()
    MessageBox.Show("Your password has been sucessfully updated.", "Success", _
                    MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
    Me.Close()

Перейти к контенту

duh_si

569 / 169 / 22

Регистрация: 18.10.2012

Сообщений: 903

1

11.07.2014, 10:50. Показов 1383. Ответов 14

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

День добрый.
ни как не могу понять где ошибка в запросе

Visual Basic
1
2
CurrentProject.Connection.Execute "UPDATE ÂÇàêàçå SET [Ïðîäóêò] = " & ProduktVr & ", [Êîëè÷åñòâî] = " & KolichestvoVr & ", [ÖåíàÇàØò]=" & CenaZaShtVr & ", " _
   & "[Ï6]=" & P6Vr & ", [Çàêàç]=" & ZakazVr & " WHERE Çàêàç =" & NomVSpiskeZak & ""

Пишет: Ошибка синтаксиса в инструкции UPDATE

Подскажите пожалуйста в чем причина…

0

Эксперт MS Access

26788 / 14467 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

11.07.2014, 11:24

2

Самая вероятная причина это пустое (NULL) значение в одной из числовых переменных. Тогда собранная строка имеет знак равенства за которым следует запятая. Конечно, это ошибка.
Другой возможный вариант, тоже очень частый — какие-то переменные имеют текстовый тип и должны окаймляться апострофами. Иначе компилятор запросов воспринимает их как непонятный объект и выходит на ошибку
Легко проверить: надо всего лишь собранную строку распечатать (Debug.Print) и поместить как SQL-выражение к конструкторе запросов. Там ошибка видна точнее.

1

569 / 169 / 22

Регистрация: 18.10.2012

Сообщений: 903

11.07.2014, 11:29

 [ТС]

3

mobile, тоже очень частый — какие-то переменные имеют текстовый тип и должны окаймляться апострофами.

с этим уже столкнулся, это поправил все

mobile, причина это пустое (NULL)

вы скорее всего правы в этом, подскажите как это можно обработать ?

0

mobile

Эксперт MS Access

26788 / 14467 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

11.07.2014, 11:32

4

Лучший ответ Сообщение было отмечено duh_si как решение

Решение

Цитата
Сообщение от duh_si
Посмотреть сообщение

как это можно обработать ?

Пример для поля Количество

SQL
1
[Количество] = " & Nz(KolichestvoVr, "NULL")

Такая запись, при пустом значении запишет NULL в собранное SQL-выражение.

1

duh_si

569 / 169 / 22

Регистрация: 18.10.2012

Сообщений: 903

11.07.2014, 11:33

 [ТС]

5

вот так примерно все выглядит

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Set StrVzakazeVr = CurrentDb.OpenRecordset("SELECT Продукт, Количество, ЦенаЗаШт, ТипЦены, " _
          & "Дополнительно, П1, П2, П3, П4, П5, " _
          & "П6, Заказ " _
          & "FROM ВЗаказеВременная WHERE Заказ =" & NomVSpiskeZak)
          
    ProduktVr = StrVzakazeVr![Продукт]
    KolichestvoVr = StrVzakazeVr![Количество]
    CenaZaShtVr = StrVzakazeVr![Ценазашт]
    TipCenyVr = StrVzakazeVr![Типцены]
    DopolnitelnoVr = StrVzakazeVr![Дополнительно]
    P1Vr = StrVzakazeVr![П1]
    P2Vr = StrVzakazeVr![П2]
    P3Vr = StrVzakazeVr![П3]
    P4Vr = StrVzakazeVr![П4]
    P5Vr = StrVzakazeVr![П5]
    P6Vr = StrVzakazeVr![П6]
    ZakazVr = StrVzakazeVr![Заказ]
    
    CurrentProject.Connection.Execute "UPDATE ВЗаказе SET [Продукт] = " & ProduktVr & ", [Количество] = " & KolichestvoVr & ", " _
    & "[ЦенаЗаШт]=" & CenaZaShtVr & ", [Дополнительно]='" & DopolnitelnoVr & "', " _
    & "[П1]=" & P1Vr & ", WHERE Заказ = " & NomVSpiskeZak & ""

0

1266 / 448 / 129

Регистрация: 21.03.2013

Сообщений: 1,210

11.07.2014, 12:10

6

Цитата
Сообщение от mobile
Посмотреть сообщение

надо всего лишь собранную строку распечатать (Debug.Print)

подскажите как дебугом пользоваться? пожалуйста или где почитать доходчиво можно
а то я, стыдно признаться, без него отладку делаю

0

shanemac51

Модератор

Эксперт MS Access

11465 / 4713 / 759

Регистрация: 07.08.2010

Сообщений: 13,686

Записей в блоге: 4

11.07.2014, 12:11

7

а должен выглядеть примерно так

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Sub www140710()
Dim s1, NomVSpiskeZak
Dim StrVzakazeVr As DAO.Recordset
NomVSpiskeZak = 1
 
s1 = ""
s1 = s1 & "SELECT Продукт, Количество, ЦенаЗаШт, ТипЦены, "
s1 = s1 & "Дополнительно, П1, П2, П3, П4, П5, П6, Заказ"
s1 = s1 & " FROM ВЗаказеВременная WHERE Заказ =" & NomVSpiskeZak
Debug.Print s1
Set StrVzakazeVr = CurrentDb.OpenRecordset(s1)
          
    
''    TipCenyVr = StrVzakazeVr![Типцены]
 
    s1 = ""
    s1 = s1 & "UPDATE ВЗаказе SET"
    s1 = s1 & " [Продукт] = " & StrVzakazeVr![Продукт]
    s1 = s1 & ", [Количество] = " & StrVzakazeVr![Количество]
    s1 = s1 & ", [ЦенаЗаШт]=" & StrVzakazeVr![Ценазашт]
    s1 = s1 & ", [Дополнительно]='" & Nz(StrVzakazeVr![Дополнительно], "0") & "'"
    s1 = s1 & ", [П1]=" & Nz(StrVzakazeVr![П1], 0)
    s1 = s1 & ", WHERE Заказ = " & NomVSpiskeZak
    Debug.Print s1
    CurrentProject.Connection.Execute s1
 
End Sub

хотя будет ерунда, если данного номера нет или их несколько

2

8791 / 5669 / 579

Регистрация: 27.03.2013

Сообщений: 19,139

11.07.2014, 14:40

8

Возможно вопрос по теме.
Нечаянно навел курсор на название данной темы и задержал малость перед тем как просмотреть ее, всплыло нечто с непонятными иероглифами.
Может в этом скрыта ощибочка?
См. рисунок и стрелки.
Или это только у меня такие выкрутасы?

Миниатюры

Ошибка в инструкции Update
 

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

подскажите как можно обработать переменные в которых дата,
допустим не ввели ни какую дату в поле, но сохранить запись нужно с этими пустыми полями

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Set StrVr = CurrentDb.OpenRecordset("SELECT Äàòà, Ïîñòàâùèê, Ñòàòóñ, Íà÷àëîÏðîèçâîäñòâà, " _
          & "Îêîí÷àíèåÏðîèçâîäñòâà, Íà÷àëîÄîñòàâêè, Îêîí÷àíèåÄîñòàâêè, Ïðîåêò, Ïîäïðîåêò, Íà÷àëîÏðîèçâîäñòâàÏëàí, " _
          & "Îêîí÷àíèåÏðîèçâîäñòâàÏëàí, Íà÷àëîÄîñòàâêèÏëàí, Îêîí÷àíèåÄîñòàâêèÏëàí, ÍîìåðÑ÷åòà, ÄàòàÑ÷åòåà, ÑòàòóñÏÔ, " _
          & "ÑëóæåáêàÄàòà, Ñðîê, Êà÷åñòâî, Öåíà " _
          & "FROM ÂðåìåííîåÑîõðàíåíèåÇàêàçà WHERE Çàêàç =" & NomVSpiskeZak)
 
    NachProizVr = Format(StrVr![Íà÷àëîïðîèçâîäñòâà], "dd.mm.yyyy")
    OkonProizVr = Format(StrVr![Îêîí÷àíèåÏðîèçâîäñòâà], "dd.mm.yyyy")
    NachDostVr = Format(StrVr![Íà÷àëîÄîñòàâêè], "dd.mm.yyyy")
    
CurrentProject.Connection.Execute "UPDATE Çàêàç SET [Íà÷àëîÏðîèçâîäñòâà]='" & NachProizVr & "', [Îêîí÷àíèåÏðîèçâîäñòâà]='" & OkonProizVr & "', " _
& "[Íà÷àëîÄîñòàâêè]='" & NachDostVr & "' " _
      & "WHERE Íîìåð =" & NomVSpiskeZak & ""

ругается на запрос update
Пишет:

Несоответствие типов данных в выражении условия отбора.

0

shanemac51

Модератор

Эксперт MS Access

11465 / 4713 / 759

Регистрация: 07.08.2010

Сообщений: 13,686

Записей в блоге: 4

15.07.2014, 14:50

11

но сохранить запись нужно с этими пустыми полями

сие не заметила, но и без этого орехов много

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim s1
Dim strVr As DAO.Recordset
s1 = ""
s1 = s1 & "SELECT Дата, Поставщик, Статус, НачалоПроизводства, "
s1 = s1 & " ОкончаниеПроизводства, НачалоДоставки, ОкончаниеДоставки, Проект,"
s1 = s1 & " Подпроект, НачалоПроизводстваПлан, "
s1 = s1 & " ОкончаниеПроизводстваПлан, НачалоДоставкиПлан, ОкончаниеДоставкиПлан,"
s1 = s1 & " НомерСчета, ДатаСчетеа, СтатусПФ, "
s1 = s1 & " СлужебкаДата, Срок, Качество, Цена "
s1 = s1 & " FROM ВременноеСохранениеЗаказа WHERE Заказ =" & NomVSpiskeZak
 
Set strVr = CurrentDb.OpenRecordset(s1)
 NachProizVr = Format(strVr![Началопроизводства], "mm/dd/yyyy")
 OkonProizVr = Format(strVr![ОкончаниеПроизводства], "mm/dd/yyyy")
 NachDostVr = Format(strVr![НачалоДоставки], "mm/dd/yyyy")
   
s1 = ""
s1 = s1 & " UPDATE Заказ SET "
s1 = s1 & " [НачалоПроизводства]=#" & NachProizVr & "#,"
s1 = s1 & " [ОкончаниеПроизводства]=#" & OkonProizVr & "#, "
s1 = s1 & " [НачалоДоставки]=#" & NachDostVr & "# "
s1 = s1 & " WHERE Номер =" & NomVSpiskeZak & ""
 CurrentProject.Connection.Execute s1

0

569 / 169 / 22

Регистрация: 18.10.2012

Сообщений: 903

15.07.2014, 15:23

 [ТС]

12

shanemac51, использую ваш код,
получаю такую ошибку
на 23 строке вашего кода

Миниатюры

Ошибка в инструкции Update
 

0

Модератор

Эксперт MS Access

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

Модератор

Эксперт MS Access

11465 / 4713 / 759

Регистрация: 07.08.2010

Сообщений: 13,686

Записей в блоге: 4

15.07.2014, 16:42

15

проверка на пустые поля

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Set strVr = CurrentDb.OpenRecordset(s1)
 
 
 
 s2 = ""
 
 If IsNull(strVr![Началопроизводства]) = False Then
 s2 = s2 & " [НачалоПроизводства]=#" & Format(strVr![Началопроизводства], "mm/dd/yyyy") & "#,"
End If
 
If IsNull(strVr![ОкончаниеПроизводства]) = False Then
s2 = s2 & " [ОкончаниеПроизводства]=#" & Format(strVr![ОкончаниеПроизводства], "mm/dd/yyyy") & "#,"
End If
 
If IsNull(strVr![НачалоДоставки]) = False Then
s2 = s2 & " [НачалоДоставки]=#" & Format(strVr![НачалоДоставки], "mm/dd/yyyy") & "#"
End If
 j2 = Len(s2)
 If j2 > 10 Then
 If Mid(s2, j2, 1) = "," Then
 s2 = Mid(s2, 1, j2 - 1)
 End If
 s1 = ""
s1 = s1 & " UPDATE Заказ SET "
 
s1 = s1 & s2
'Номер
s1 = s1 & " WHERE номер =" & NomVSpiskeZak
Debug.Print s1
DoCmd.RunSQL s1
End If
' CurrentProject.Connection.Execute s1

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

Raize Ahamed's user avatar

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 Ahamed's user avatar

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. Вероятно, это сработает, но: НИКОГДА не храните пароли в базе данных. Вместо этого используйте соленые хэши.

Logo
MurCode

  • Форумы
  • Поиск
  • О проекте

Pasha_Sem

Дата: 05.02.2007 16:05:46

Все привет !
Пытаюсь в таблицу Access добавить значение! выдает сообщение
Ошибка синтаксиса в инструкции UPDATE
Кто сталкивался подскажите где ошибка?
ataSet myDataSet = new DataSet();
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter();

private void button3_Click(object sender, EventArgs e)
{
string connectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BugTypes.MDB»;
string select = «UPDATE Categories» + » SET Category Name = ‘HI’ » + » WHERE Category ID = ‘3’»;
OleDbConnection testConnection = new OleDbConnection(connectionString);
testConnection.Open();
// OleDbCommand testCommand = new OleDbCommand(«SELECT * FROM Categories», testConnection);
OleDbCommand testCommand = new OleDbCommand(select, testConnection);
int rowsReturn = testCommand.ExecuteNonQuery();
testConnection.Close();
}
}
}

Спасибо!

HandKot

Дата: 05.02.2007 16:48:41

автор
SET Category Name = ‘HI’ » + » WHERE Category ID = ‘3’»

если нет символа подчеркивания, тогда названия полей надо взять в квадратные скобки

SET [Category Name] = 'HI' " + " WHERE [Category ID] = '3'"

вроде так

I Have Nine Lives You Have One Only
THINK!

Pasha_Sem

Дата: 05.02.2007 17:55:44

Исправленный синтаксис теперь верен
после таких изминений
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
// The insertSQL string contains a SQL statement that
// inserts a new row in the source table.
OleDbCommand command = new OleDbCommand(«UPDATE Categories SET [Category Name] = ‘Привет’ WHERE [Category ID] = 1», connection);

// Set the Connection to the new OleDbConnection.
command.Connection = connection;

// Open the connection and execute the insert command.
try
{
connection.Open();
command.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

но появляеться исключение
Отсутствует значениедля одного или нескольких требуемых параметров
Таже истормя при оригенальном коде! что и в первом примере

HandKot

Дата: 06.02.2007 09:08:55

автор
но появляеться исключение
Отсутствует значениедля одного или нескольких требуемых параметров
Таже истормя при оригенальном коде! что и в первом примере

а вы запустите запрос в самом Access, он выполниться?

I Have Nine Lives You Have One Only
THINK!

Понравилась статья? Поделить с друзьями:
  • Ошибка синтаксиса в инструкции create table access
  • Ошибка приложения explorer exe инструкция по адресу
  • Офельтаминвир цена инструкция по применению
  • Офадез 5л дез средство инструкция
  • Оф трикс капли глазные инструкция