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

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

Понравилась статья? Поделить с друзьями:

Новое и полезное:

  • Ошибка синтаксиса в инструкции create table access
  • Ошибка приложения explorer exe инструкция по адресу
  • Ошибка при входе в аккаунт следуйте инструкциям на этой странице ютуб
  • Ошибка инструкция по адресу 0x00000000 обратилась к памяти по адресу 0x00000000
  • Ошибка инструкция по адресу 0x00000000 обратилась к памяти по адресу 0x00000000

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии