2013-02-16 46 views
2

我有刪除行的存儲過程。示例代碼:必須一個T-SQL存儲過程包含腳本支持的SqlClient交易?

CREATE PROCEDURE [dbo].[ap_um_delete_tems_grid] 
(
    @agency char(3) 
    , @subagency char(1) 
    , @grid_id int 
    , @role_id int 
) 
AS 
DELETE FROM [grid_setup] 
    WHERE agency = @agency 
    AND subagency = @subagency 
    AND gs.grid_id = @grid_id 
    AND role_id = @role_id 

如果我直接從Sql Mgmt Studio執行此SProc,它工作正常。但是,如果我嘗試使用一個交易做在C#代碼,我得到一個非常有趣的SQLException:

附近有語法錯誤ap_um_delete_tems_grid「

異常詳細信息說,它發生在1號線。C#代碼是:

using (SqlConnection connection = new SqlConnection(conn.TemsConnectionString)) 
{ 
    connection.Open(); 
    SqlCommand command = connection.CreateCommand(); 
    SqlTransaction transaction; 

    // Start the local transaction 
    transaction = connection.BeginTransaction("GridReplaceTransaction"); 
    command.Connection = connection; 
    command.Transaction = transaction; 

    try 
    { 
     command.CommandText = "ap_um_delete_tems_grid"; 

     SqlParameter parm = new SqlParameter(); 

     // Adding the parameters 

     int cnt = command.ExecuteNonQuery(); 
     transaction.Commit(); 
    } 
    catch (Exception ex) 
    { 
     transaction.Rollback(); 
    } 
} 

上面的代碼在我將其放入事務之前工作。爲什麼我會收到語法錯誤?也許是因爲在SProc中需要有一些東西來支持交易?還是我在亂七八糟的東西呢?

注:請不要試圖告訴我,我並不需要一個事務單個刪除。以上是多步驟過程的一部分,即刪除後添加新行。謝謝。

+0

對不起,希望它站出來之前,有人告訴我一些無關緊要的問題。不要大喊,只是想阻止某人發表無用的評論。我以前見過這種東西,只是想把它短路。 – Cyberherbalist 2013-02-16 01:05:11

+0

用斜體字替換大寫淡化的說明。不想看起來過於霸道或嚇壞了。 – Cyberherbalist 2013-02-16 01:11:43

+0

您有其他幾個_newb_錯誤:你'SqlCommand'和'SqlTransaction'需要在'using'塊。而且,忽略異常是一個非常糟糕的主意。你應該用'throw;'重新拋出它,或者用'ex'拋出一個新的異常作爲'InnerException':'throw new Exception(「My message」,ex);'。最糟糕的是,你應該記錄或顯示完整的'ex.ToString()'。 – 2013-02-16 01:15:15

回答

5

你缺少:

command.CommandType = CommandType.StoredProcedure; 

否則,它使用的CommandType.Text默認並作爲一份聲明中,而不是存儲過程的名稱對待"ap_um_delete_tems_grid"

+0

O.M.G.我不敢相信我做了這麼簡單的* noob *錯誤。當然你完全正確;一旦我添加這條線,它完美的工作。 – Cyberherbalist 2013-02-16 01:07:00