2015-09-27 83 views
1

我試圖以編程方式針對MSSQL數據庫創建多個存儲過程,函數和表。System.Data.SqlClient事務和錯誤處理支持

我正在通過System.Data.SqlClient庫,而不是Microsoft.SqlServer.Management.Smo庫這樣做。但是,無論何時我使用transactiontry - catch塊的腳本,我都會得到不正確的語法錯誤消息,但是當我直接對數據庫運行腳本(通過Management Studio)時,它工作正常。

這樣腳本的例子可以發現如下:

CREATE PROCEDURE [Mobile].M_CreateOrder (@OrderName varchar(255),@DELDATE DATETIME, @DELQTY INT, @PRODID INT, @CUSTID INT)  
AS BEGIN  
BEGIN TRY  
BEGIN TRANSACTION  
DECLARE @DATE DATETIME = GETDATE(), @SUCCESS INT = 0  
DECLARE @ORDERID INT = (SELECT MAX(ORDER_ID) + 1 FROM ORDERS)  
INSERT INTO [dbo].[ORDERS]  
      (  
      [ORDER_ID]  
      ,[ORDER_NAME]  
      ,[PRODUCT_ID]  
      ,[CUSTOMER_ID]  
      )  
     VALUES  
      ( 
      @ORDERID  
      ,@OrderName  
      ,@PRODID  
      ,@CUSTID  
      )  
      COMMIT TRAN  
      SET @SUCCESS = 1  
      END TRY  
      BEGIN CATCH  
       INSERT INTO Mobile.M_LOG (ENTRY_DATE, ENTRY_MESSAGE) VALUES (GETDATE(), ERROR_MESSAGE())  
       IF @@TRANCOUNT > 0  
       ROLLBACK TRAN  
      END CATCH  
      --Enter the row in the delivery column  
      BEGIN TRY  
      IF(@SUCCESS = 1)  
       BEGIN  
       EXEC M_CreateDelivery @ORDERID, @DELDATE, @DELQTY  
       END  
      END TRY  
      BEGIN CATCH  
       INSERT INTO Mobile.M_LOG (ENTRY_DATE, ENTRY_MESSAGE) VALUES (GETDATE(), ERROR_MESSAGE())  
       IF @@TRANCOUNT > 0  
       ROLLBACK TRAN  
      END CATCH  
END 

每當這個腳本通過System.Data.SqlClient.SqlCommand.ExecuteNonQuery()跑到我得到以下錯誤:

Exception Details: System.Exception: System.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near 'CATCH'. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
    at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at SQL.NonQuery.Execute() in D:\Users\Blake\Documents\GitHub\SQL\NonQuery.cs:line 23 

這是到使用SqlClient庫,而不是圖書館的smo還是有其他我完全錯過的東西?

如果這是使用SqlClient庫,是否有關於什麼和不支持的文檔? - 該ExecuteNonQuery MSDN Page沒有列出任何明確的限制,但它說的功能,可用於執行這些操作:

You can use the ExecuteNonQuery to perform catalog operations (for example, querying the structure of a database or creating database objects such as tables).

+1

可以顯示C#代碼,顯示如何將文本加載到'SqlCommand'中?沒有像你遇到的限制,我最好的猜測是你在C#代碼中有一個錯誤,但我們需要首先看到它。 –

回答

1

我的這個越早發現...問題是意見。

因爲我只是在每行的末尾添加一個空格並將字符串連接在一起,所以在行註釋之後的所有內容都被註釋掉了。

\r\n添加到每行的末尾可解決問題。