Подключение к SQL базе данных сервера - PullRequest
0 голосов
/ 26 января 2020

A. NET приложение, из которого устанавливается соединение и выполняется запрос следующим образом (заключенный в блок try-catch):

using (SqlConnection conn = new SqlConnection(Configuration.connectionString))
{
    SqlCommand cmd = new SqlCommand(createTransactionQuery,conn);
    conn.Open();
    return cmd.ExecuteNonQuery();
}

Строка запроса:

createTransactionQuery = "BEGIN " +
                         "BEGIN Transaction" +
                         "  BEGIN TRY " +
                         "      --variables" +
                         "      DECLARE @varStaffID int;" +
                         "      DECLARE @varProductID int;" +
                         "      SET @varStaffID = " + transaction.getStaff().getID() + ";" +
                         "      SET @varProductID = " + transaction.getProduct().getProductID() + ";" +
                         " " +
                         "      --New record in Transactions table " +
                         "      INSERT INTO Transactions (Timestamp_, CustomerID, StaffID, ProductID) " +
                         "      VALUES (SYSDATETIME(),NULL,@varStaffID,@varProductID; " +
                         " " +
                         "      --Update inventory (Products table)" +
                         "      --First retrieve the current quantity of this product" +
                         "      DECLARE @varCurrQuantity int; " +
                         "      SET @varCurrQuantity = (SELECT Quantity FROM Products WHERE ProductID=@varProductID); " +
                         "      --and update it" +
                         "      UPDATE Products " +
                         "      SET Quantity = @varQuantity-1 " +
                         "      WHERE ProductID = @varProductID; " +
                         "  END TRY " +
                         "  BEGIN CATCH " +
                         "      ROLLBACK Transaction " +
                         "  END CATCH " +
                         "COMMIT Transaction" +
                         "END";

Этот код вызывает исключение:

System.Exception: неправильный синтаксис рядом с 'BEGIN'.

Я знаю, что строка запроса может быть создана в лучший способ. Однако я хочу знать, в чем причина проблемы, так как этот точный запрос работает, когда он выполняется внутри SQL Server Management Studio.

Я убедился, что строка подключения верна, так как он работает точно так же, как и в другой части приложения.

Ответы [ 3 ]

2 голосов
/ 26 января 2020

Кажется, здесь у вас отсутствует закрывающая круглая скобка:

VALUES (SYSDATETIME(),NULL,@varStaffID,@varProductID; " 

Однако этот тип конкатенации строк открыт для SQL Атаки с помощью инъекций. Вы всегда должны использовать параметризованные запросы , чтобы избежать SQL Инъекции , а также чтобы избавиться от ошибок такого рода.

Чтобы узнать, как использовать параметризованные запросы, см. пример ниже:

{ ссылка }

0 голосов
/ 26 января 2020

Вы пропустили пробел между "COMMIT Transaction" + "END"; используйте это "COMMIT Transaction" + " END";

Также вы не объявили varQuantity и пропустили закрывающую скобку после " VALUES (SYSDATETIME(),NULL,@varStaffID,@varProductID; "

0 голосов
/ 26 января 2020

вы можете попробовать это для транзакции. удалите первый и последний конец вашего кода и следуйте этой инструкции:

BEGIN TRANSACTION trans
  BEGIN TRY  
     --Do some insert or update
     COMMIT TRANSACTION trans
  END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION trans
END CATCH
...