System.Data.SqlClient事务和错误处理支持

本文关键字:错误 处理 支持 事务 Data SqlClient System | 更新日期: 2023-09-27 18:14:48

我试图以编程方式创建针对MSSQL数据库的多个存储过程,函数和表。

我通过System.Data.SqlClient库,而不是 Microsoft.SqlServer.Management.Smo库来做到这一点。然而,每当我使用一个脚本与transactiontry - catch块,我得到一个不正确的语法错误消息,但当我运行脚本直接对数据库(通过管理工作室)它工作得很好。

可以在下面找到一个这样的脚本示例:

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页面没有列出任何明确的限制,但确实说函数可以用于执行这些操作:

您可以使用ExecuteNonQuery来执行目录操作(对于)例如,查询数据库结构、创建数据库对象(如表)。

System.Data.SqlClient事务和错误处理支持

我应该早点注意到这一点…问题是注释。

当我只是在每行的末尾添加一个空格并将字符串连接在一起时,行注释之后的所有内容都被注释掉了。

'r'n添加到每行的末尾可以解决这个问题。