ExecuteNonQuery возвращает значение 2, когда обновлена ​​только 1 запись - PullRequest
2 голосов
/ 20 сентября 2011

При выполнении примеров Enterprise Library 5.0 и когда я использую ExecuteNonQuery для запуска sproc-обновления, он возвращает 2. Обновление основано на ProductID, Первичном ключе таблицы (да, я проверял, и он уникален).

Вот простой спрок:

ALTER PROCEDURE [dbo].[UpdateProductsTable]
     @ProductID int, 
     @ProductName varchar(50) = NULL, 
     @CategoryID int = NULL, 
     @UnitPrice money = NULL
AS
BEGIN
    UPDATE Products
    SET 
        ProductName = @ProductName, 
        CategoryID = @CategoryID, 
        UnitPrice = @UnitPrice
    WHERE ProductID = @ProductID
END

Выполнение этого sp в SSMS показывает «1 ряд» в нижнем правом углу окна результатов запроса и возвращаемое значение 0 в сетке. При нажатии на вкладку сообщений отображается

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

не уверен, почему я вижу это 3 раза здесь, но я не верю, что это проблема.

Вот код, вызывающий sp:

public static void Exec_Update_Query()
        //updates a column of a single row, checks that the update succeeded, and then update it again to return it to the original value 
        {
            string oldName = "Chai";
            string newName = "Chai Tea";

            SqlDatabase defaultDB = EnterpriseLibraryContainer.Current.GetInstance<Database>() as SqlDatabase;

            // Create command to execute the stored procedure and add the parameters.
            DbCommand cmd = defaultDB.GetStoredProcCommand("UpdateProductsTable");
            defaultDB.AddInParameter(cmd, "ProductID", DbType.Int32, 1);
            defaultDB.AddInParameter(cmd, "ProductName", DbType.String, newName);
            defaultDB.AddInParameter(cmd, "CategoryID", DbType.Int32, 1);
            defaultDB.AddInParameter(cmd, "UnitPrice", DbType.Currency, 18);

            // Execute the query and check if one row was updated.
            int i = defaultDB.ExecuteNonQuery(cmd);
            if (i == 1)
            {
              // Update succeeded.
            }
            else
            {
                Console.WriteLine("ERROR: Could not update just one row.");
            }

            // Change the value of the second parameter
            defaultDB.SetParameterValue(cmd, "ProductName", oldName);

            // Execute query and check if one row was updated
            if (defaultDB.ExecuteNonQuery(cmd) == 1)
            {
              // Update succeeded.
            }
            else
            {
                Console.WriteLine("ERROR: Could not update just one row.");
            }
        }

Я использую int i для просмотра возвращаемого значения из метода, и он возвращает 2. Есть идеи, почему это будет? Это Enterprise Libarary 5.0 в VS2010, работающий на SQL 2005. Довольно простой, но сбивающий с толку.

1 Ответ

5 голосов
/ 20 сентября 2011

Если я правильно помню, результат любых триггеров, которые срабатывают в результате ваших команд, также будет включен в число возвращенных строк. Скорее всего, это ваша проблема.

РЕДАКТИРОВАТЬ: Документация

С MSDN SqlCommand.ExecuteNonQuery :

Если для вставляемой или обновляемой таблицы существует триггер, возвращаемое значение включает количество строк, на которые влияет операция вставки или обновления, и количество строк, на которые воздействует триггер или триггеры.

...