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,col2并col3从不同的表,并迁移为外键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,second和third.
问题
我可以将一个复杂的SQL语句写入IDbCommand.CommandText属性,而每条指令都用分号(;)分隔吗?
是否可以在BEGIN TRANSACTION...COMMIT/ROLLBACK此CommandText属性中包含?
简而言之,我可以写这样的东西吗?
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的答案,因为无论如何它都是可行的解决方案.
在此先感谢您的宝贵帮助和时间!这对我来说至关重要!
如果您不能使用存储过程,那么此代码可能满足您的要求:
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)
我根据需要添加了表变量以使示例代码运行,显然您可以使用永久表。