我正在尝试以编程方式针对MSSQL数据库创建多个存储过程,函数和表。
我是通过System.Data.SqlClient
库,而非 Microsoft.SqlServer.Management.Smo
库完成此操作的。但是,每当我使用带有transaction
或try - 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没有列出任何明确的限制,但确实说该函数可用于执行这些操作:
您可以使用ExecuteNonQuery执行目录操作(for 例如,查询数据库的结构或创建数据库 对象如表)。
答案 0 :(得分:1)
我应该更早注意到这一点......问题在于评论。
由于我只是在每行的末尾添加一个空格并将字符串连接在一起,所以在注释后的所有内容都被注释掉了。
在每行的末尾添加\r\n
解决了问题。