如何在SqlTransaction中使用“use”绑定

时间:2016-11-25 22:53:25

标签: f#

在MSSQL Server中,我有一个名为TestTable的数据库,其中包含一个名为TestTable的三列(Id,FirstName,LastName)的表。要将行插入type Person = { Id:int; FirstName:string; LastName:string } ,我已声明了一个类型

let Parameters(person:Person) = 
    [|
        SqlParameter("@Id", person.Id)
        SqlParameter("@FirstName", person.FirstName)
        SqlParameter("@LastName", person.LastName)
    |]          

let Transaction(tsql, sqlcon, sqltran, sqlparam) =        
    let cmd = new SqlCommand(tsql, sqlcon, sqltran);
    for p in sqlparam do
        cmd.Parameters.Add(p) |> ignore
    cmd

两种方法1)参数和2)交易

let population = [{Person.Id = 1; Person.FirstName = "Emon1"; Person.LastName = "Haque1"}
                  {Person.Id = 2; Person.FirstName = "Emon2"; Person.LastName = "Haque2"}]

let query = @"INSERT INTO TestTable VALUES(@Id, @FirstName, @LastName)"
let conStr = @"server=EMON; database=TestDB; user=TestUser; password=TestPass"      
use con = new SqlConnection(conStr)
con.Open()
let trans = con.BeginTransaction()

try
    population
    |> List.iter(fun x -> Transaction(query, con, trans, Parameters(x)).ExecuteNonQuery() |> ignore)
    |> trans.Commit
with
    | exn -> trans.Rollback()

在我的控制台应用程序的main方法中我以这种方式使用了类型和方法

use

我在main方法中使用SqlConnection一次SqlCommand

我应该将其用于Transaction函数con.BeginTransaction()中的SqlCommand,以及调用Transaction的情况,因为它在main方法中返回use conWorkspace将照顾好所有人?

1 个答案:

答案 0 :(得分:3)

如果您熟悉C#,那么use就像C#中的using一样。当值超出范围时,将调用Dispose。作为一般规则,如果您没有use值,则不会调用Dispose

某些.NET API具有处理包含的一次性的选项。例如,StreamReader将自动处理Stream包含的内容,除非使用a constructor overload where you can override that behaviour明确构造。

据我所知,这些API没有一致性,所以你不能依赖一次性用品的层次结构来表现那种方式。

具体来说,我没有看到BeginTransaction的任何重载指定返回的事务如何与创建它的连接相关,文档也没有说明。我use trans值,而不是希望BCL中的不明确行为会做正确的事。