Получение синтаксической ошибки на SQL-код и не могу понять, почему - PullRequest
0 голосов
/ 05 апреля 2019

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

        clsDBConnector dbConnector = new clsDBConnector();
        OleDbDataReader dr;
        dbConnector.Connect();
        string sqlStr1 = "SELECT ItemID" +
            " FROM         TblItem" +
            " WHERE ([Item Name]= " + ItemName + ")";
        dr = dbConnector.DoSQL(sqlStr1);
        while (dr.Read())
        {
            string ItemID = dr[0].ToString();
            string sqlStr2 = "SELECT   TOP 1 OrderItemID" +
            " FROM         TblOrderItem" +
            " WHERE(OrderID =" + orderID + ") AND(ItemID =" + ItemID +")";
            dr = dbConnector.DoSQL(sqlStr2);
            while (dr.Read())
            {
                string OrderItemID = dr[0].ToString();
                string sqlStr3 = "DELETE FROM TblOrderItem" +
                    " WHERE    (OrderItemID =" + OrderItemID + ")";
                dr = dbConnector.DoSQL(sqlStr3);
            }
        }

1 Ответ

0 голосов
/ 05 апреля 2019

Это выглядит , как будто вы выполняете два вложенных запроса для одного и того же соединения, но: это обычно не поддерживается (если у вас не включен "MARS", что обычно является плохой идеей).Вы должны увидеть исключение из-за того, что в соединении уже есть открытый считыватель данных.Вы должны закончить первый читатель, прежде чем начать беспокоиться о дополнительных данных.Вы могли бы сделать это путем буферизации данных, но, честно говоря, я подозреваю, что вы могли бы также заново обработать запрос, чтобы он представлял собой либо один запрос с объединением, либо два запроса в одном и том же SQL - это также было бы более эффективным(он избегает "N + 1").

Другая основная проблема заключается в том, что вы объединяете данные для создания SQL, что неизменно является плохой идеей.В худшем случае это дыра для внедрения SQL, а в лучшем случае она насыщает кэш вашего плана запросов.Итак: пожалуйста, используйте параметры вместо конкатенации.Параметры также позволяют избежать таких проблем, как экранирование, перенос строк в кавычки и проблемы i18n / l10n, касающиеся форматирования целых чисел, дат и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...