Member 14796688 Ответов: 3

Как исправить синтаксическую ошибку (отсутствует оператор) с помощью visual studio 2019 с базой данных MS access


private void btnSave_Click(object sender, EventArgs e)
        {
            //Sale table

            {
                string str = "INSERT INTO Sales (Invoice,CustomerName,SaleDate,TotalAmt,VAT,Discount,TotalPayAmt,Paid,Balance) VALUES ("+ Invoice_tx.Text +", '"+ CustomerName_cb.Text +"', '"+ SaleDate_dt.Value.Date.ToString() +"', "+ TotalAmnt_tx.Text +", "+ VAT_tx.Text +", "+ Discount_tx.Text +", "+ TotalPayAmnt_tx.Text +",​​​ "+ Paid_tx.Text +", "+ Balance_tx.Text +") ";

                OleDbDataAdapter da = new OleDbDataAdapter(str, conn);               
                //DataSet ds = new DataSet();
                DataTable dt = new DataTable();
                da.Fill(dt);
                
            }
            //SaleItem table

            for (int i = 0; i < metroGrid1.Rows.Count; i++)
            {
                string insertPur = "INSERT INTO SaleItems (Invoice,Pid,Product,Qty,Rate,Amount) VALUES ( " + Invoice_tx.Text + ", " + metroGrid1.Rows[i].Cells["Pid"].Value.ToString() + ", '" + metroGrid1.Rows[i].Cells["Product"].Value.ToString() + "',  " + metroGrid1.Rows[i].Cells["Qty"].Value.ToString() + ", " + metroGrid1.Rows[i].Cells["Rate"].Value.ToString() + ", " + metroGrid1.Rows[i].Cells["Amount"].Value.ToString() + ") ";

                OleDbDataAdapter da = new OleDbDataAdapter(insertPur, conn);
                DataSet ds = new DataSet();
                da.Fill(ds);

            }
            //Stock Table
            {

                for (int i = 0; i < metroGrid1.Rows.Count; i++)
                {
                    OleDbDataAdapter da1 = new OleDbDataAdapter("SELECT * FROM Stock WHERE Pid= " + metroGrid1.Rows[i].Cells["Pid"].Value.ToString() + " AND Product= '" + metroGrid1.Rows[i].Cells["Product"].Value.ToString() + "'  ", conn);
                    DataSet ds1 = new DataSet();
                    da1.Fill(ds1);

                    if (ds1.Tables[0].Rows.Count > 0)

                    {

                        //When Item exist in stock!

                        string insertPur = "UPDATE Stock SET Qty= Qty- " + metroGrid1.Rows[i].Cells["Qty"].Value.ToString() + " Where Pid=" + metroGrid1.Rows[i].Cells["Pid"].Value.ToString() + " ";

                        OleDbDataAdapter da = new OleDbDataAdapter(insertPur, conn);
                        DataSet ds = new DataSet();
                        da.Fill(ds);
                    }
                    else
                    {
                        //When Item doesn't exist in stock!

                        string insertPur = "INSERT INTO Stock (Pid,Product,Qty,Rate,Amount) VALUES (" + metroGrid1.Rows[i].Cells["Pid"].Value.ToString() + ", '" + metroGrid1.Rows[i].Cells["Product"].Value.ToString() + "', " + metroGrid1.Rows[i].Cells["Qty"].Value.ToString() + ", " + metroGrid1.Rows[i].Cells["Rate"].Value.ToString() + ",  " + metroGrid1.Rows[i].Cells["Amount"].Value.ToString() + " ) ";

                        OleDbDataAdapter da = new OleDbDataAdapter(insertPur, conn);
                        DataSet ds = new DataSet();
                        da.Fill(ds);
                    }

                }
            }

            MessageBox.Show("The Record Saved Successfully!", "SAVE", MessageBoxButtons.OK, MessageBoxIcon.Information);

            Clear();
            ClearItems();       
            metroGrid1.Rows.Clear();
            NewInvoice();


        }


Что я уже пробовал:

Я пытался выполнить приложение много раз, но все еще не работает он показывает сообщение синтаксическая ошибка (отсутствует оператор) Я использовал базу данных MS Access и Visual Studio 2019, пожалуйста, помогите мне решить эту проблему

3 Ответов

Рейтинг:
2

Patrice T

Цитата:
он показывает сообщение синтаксическая ошибка (отсутствует оператор)

Дайте точное сообщение об ошибке, оно обычно включает имя файла и номер строки, где находится ошибка.
string str = "INSERT INTO Sales (Invoice,CustomerName,SaleDate,TotalAmt,VAT,Discount,TotalPayAmt,Paid,Balance) VALUES ("+ Invoice_tx.Text +", '"+ CustomerName_cb.Text +"', '"+ SaleDate_dt.Value.Date.ToString() +"', "+ TotalAmnt_tx.Text +", "+ VAT_tx.Text +", "+ Discount_tx.Text +", "+ TotalPayAmnt_tx.Text +",​​​ "+ Paid_tx.Text +", "+ Balance_tx.Text +") ";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


CHill60

Ирония заключается в том, что использование параметров, вероятно, решит эту проблему! 5'd

Patrice T

Спасибо, согласен :)
Даже не уверен, что проблема в SQL без номера строки.

CHill60

У меня есть "возможность" использовать MS Access каждый день в моей нынешней роли. Я привык видеть эту ошибку :-( обычно это означает синтаксическую ошибку в Access SQL, но редко означает, что действительно отсутствует оператор :-)

Maciej Los

Кэролайн, это звучит как ответ...

CHill60

Это более тонко, чем это ... смотрите мое решение! Странно!

Maciej Los

5ed!

Рейтинг:
2

Garth J Lancaster

1) я думаю, что вы должны использовать Visual Studio, чтобы сузить область, в которой возникает ваша ошибка, а затем обновить этот вопрос

2) составление SQL таким образом просто так устарело (опасно, Старо, неправильно) даже для такого Бумера, как я, - и, как вы уже видели, склонного к трудноопределимым ошибкам, - взгляните на https://stackoverflow.com/questions/9433148/generating-sql-queries-safely-in-c-sharp и еще https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparameter?redirectedfrom=MSDN&view=netframework-4.8


Рейтинг:
0

CHill60

В коде с самого начала

string str = "INSERT INTO Sales (Invoice,CustomerName,SaleDate,TotalAmt,VAT,Discount,TotalPayAmt,Paid,Balance) VALUES ("+ Invoice_tx.Text +", '"+ CustomerName_cb.Text +"', '"+ SaleDate_dt.Value.Date.ToString() +"', "+ TotalAmnt_tx.Text +", "+ VAT_tx.Text +", "+ Discount_tx.Text +", "+ TotalPayAmnt_tx.Text +",​​​ "+ Paid_tx.Text +", "+ Balance_tx.Text +") ";
у вас есть непечатаемый символ в поле +", "+ между TotalPayAmnt_tx.Text и Paid_tx.Text.

На самом деле, если я вставлю этот раздел, скажем, в VBE в Excel, он будет выглядеть так
TotalPayAmnt_tx.Text +",??? "+ Paid_tx.Text
Это все они ??? это вызывает вашу синтаксическую ошибку.

Если вы последуете совету Патриса Т (@ppolymorphe) в решении 2 и используете параметризованные запросы, то проблема, к сожалению, не исчезнет (что необычно в этих случаях) - решение состоит в том, чтобы удалить тот символ, который выглядит как пробел, но которым он не является.

Но вы действительно, действительно должны использовать параметризованные запросы, например (непроверенные)
string str = "INSERT INTO Sales (Invoice,CustomerName,SaleDate,TotalAmt,VAT,Discount,TotalPayAmt,Paid,Balance) VALUES (?,?,?,?,?,?,?,?,?)";
OleDbDataAdapter da = null;
// these must be in the right order!
da.SelectCommand.Parameters.Add("invoice",OleDbType.VarChar, 100).Value = Invoice_tx.Text;
//etc


Maciej Los

5ed!

Patrice T

И мои 5 тоже.