是否可以在ADO.NET Command.CommandText属性中包含多个SQL指令?

Wil*_*ler 8 sql t-sql ado.net command .net-3.5

摘要

我正在编写一个应用程序,我将SQL指令放在项目的参数中.

在代码中,我得到了我的查询的值,它返回查询本身.比如说我的SQL查询是这样的:

select col1, col2, col3 from my_table
Run Code Online (Sandbox Code Playgroud)

此外,col1,col2col3从不同的表,并迁移为外键MY_TABLE.因此,当涉及到插入时,我必须执行多个INSERT语句以从这些上述列的其他表中获取值.我们说如下:

BEGIN TRANSACTION

insert into first_table (col_x, col_y) values ('col_x', 'col_y')
insert into second_table (col_z, col_a) values ('col_z', 'col_a')
insert into third_table (col_b, col_c) values ('col_b', 'col_c')
Run Code Online (Sandbox Code Playgroud)

最后:

insert into my_table (col1, col2, col3, col_v) values (@col1, @col2, @col3, 'col_v')

COMMIT
Run Code Online (Sandbox Code Playgroud)

认为这些col1,col2,col3列于表自动递增的整数first,secondthird.

问题

  1. 我可以将一个复杂的SQL语句写入IDbCommand.CommandText属性,而每条指令都用分号(;)分隔吗?

  2. 是否可以在BEGIN TRANSACTION...COMMIT/ROLLBACKCommandText属性中包含?

  3. 简而言之,我可以写这样的东西吗?

    Using cnx = New SqlConnection(connString)
        Using cmd = cnx.CreateCommand()
            cmd.CommandText = "BEGIN TRANSACTION " _
                      & "insert into first_table (col_x, col_y) values ('col_x', 'col_y');" _ 
                      & "insert into second_table (col_z, col_a) values ('col_z', 'col_a');" _
                      & "insert into third_table (col_b, col_c) values ('col_b', 'col_c');" _
                      & "insert into my_table (col1, col2, col3, col_v) values (@col1, @col2, @col3, 'col_v'); " _
                      & "COMMIT"
            cmd.ExecuterNonQuery()
        End Using
    End Using
    
    Run Code Online (Sandbox Code Playgroud)

编辑#1

我之前应该提到它... Mack的答案是我想要的方式,除了我不能因为我客户的IT部门内的奇怪政策,除非我使用他们的自定义组件,我宁愿避免简单的缘故.请注意,无论如何我都支持Mack的答案,因为无论如何它都是可行的解决方案.

在此先感谢您的宝贵帮助和时间!这对我来说至关重要!

Mac*_*ack 5

如果您不能使用存储过程,那么此代码可能满足您的要求:

SqlConnection cnx = new SqlConnection(connString);
SqlCommand cmd = cnx.CreateCommand();
cnx.Open();
string complexCommand = string.Concat(
"DECLARE @first_table AS TABLE(col1 int IDENTITY, col_x varchar(20), col_y varchar(20))"
, " DECLARE @second_table AS TABLE(col2 int IDENTITY, col_z varchar(20), col_a varchar(20))"
, " DECLARE @third_table AS TABLE(col3 int IDENTITY, col_b varchar(20), col_c varchar(20))"
, " DECLARE @my_table AS TABLE(col1 int, col2 int, col3 int, col_v varchar(20))"
, " DECLARE @col1 int"
, " DECLARE @col2 int"
, " DECLARE @col3 int"
, " BEGIN TRAN"
, " BEGIN TRY"
, "   insert into @first_table (col_x, col_y) values ('col_x', 'col_y')"
, "   SET @col1=@@IDENTITY"
, "   insert into @second_table (col_z, col_a) values ('col_z', 'col_a')"
, "   SET @col2=@@IDENTITY"
, "   insert into @third_table (col_b, col_c) values ('col_b', 'col_c')"
, "   SET @col3=@@IDENTITY"
, "   insert into @my_table(col1, col2, col3, col_v) values (@col1, @col2, @col3, 'col_v')"
, "   COMMIT"
, " END TRY"
, " BEGIN CATCH"
, "   ROLLBACK"
, " END CATCH");

cmd.CommandText = complexCommand;
cmd.ExecuteNonReader();
Run Code Online (Sandbox Code Playgroud)

我根据需要添加了表变量以使示例代码运行,显然您可以使用永久表。

  • @WillMarcouiller C# 支持多行字符串文字。 (9认同)