在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 con
或Workspace
将照顾好所有人?
答案 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中的不明确行为会做正确的事。