这是使用的正确方法是BeginTransaction()用IDbConnection在小巧玲珑的?
我创建了一个必须使用的方法BeginTransaction().这是代码.
using (IDbConnection cn = DBConnection)
{
var oTransaction = cn.BeginTransaction();
try
{
// SAVE BASIC CONSULT DETAIL
var oPara = new DynamicParameters();
oPara.Add("@PatientID", iPatientID, dbType: DbType.Int32);
..........blah......blah............
}
catch (Exception ex)
{
oTransaction.Rollback();
return new SaveResponse { Success = false, ResponseString = ex.Message };
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行上面的方法 - 我有一个例外 -
操作无效.连接已关闭.
这是因为在打开连接之前无法开始事务.所以当我添加这一行:时cn.Open();,错误得到解决.但我已经读过某个地方,手动打开连接是不好的做法!! Dapper仅在需要时才打开连接.
在Entity框架中,您可以使用a处理事务TransactionScope.
所以我的问题是cn.Open()...在没有在Dapper中添加行来处理事务的好习惯是什么?我想应该有一些正确的方法.
在SQL Server中,如果我这样写命令-
EXEC SP_HELP EmployeeMaster
它将返回我的表格字段以及在其上定义的所有默认约束。现在我只想知道在上面的postgres中有什么命令吗?
虽然我知道在postgres中仅获取表字段,但是您可以使用以下查询。
select column_name from information_schema.columns where table_name = 'EmployeeMaster'
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用来在Dapper中设置事务隔离级别SqlBuilder,但似乎没有用。
var builder = new SqlBuilder();
var sqlStatement = builder.AddTemplate(@"
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT * FROM Users
SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
conn.Query<User>(sqlStatement.RawSql);
Run Code Online (Sandbox Code Playgroud)
但这有效:
conn.Execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
var result = conn.Query<User>(sqlStatement);
conn.Execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
Run Code Online (Sandbox Code Playgroud)
我想这可能是因为使用SqlBuilderDapper构建了动态SQL并使用sp_executesql存储过程执行了。
为了证明我的假设,我尝试了以下SQL语句:
exec sp_executesql N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'
Run Code Online (Sandbox Code Playgroud)
该语句之后,我查询sys.dm_exec_sessions检查我的连接,它仍然显示ReadCommitted数据库中的默认隔离级别。
有什么办法可以SET在单独的地方设置交易级别(或任何其他语句).Execute?或者,也许是一种特殊的使用SET语句的方式sp_executesql?