我有一个父对象(DAL的一部分),其中包含List<t>子对象的collection().
当我将对象保存回DB时,我输入/更新父对象,然后循环遍历每个子对象.为了可维护性,我将孩子的所有代码放入一个单独的私有方法中.
我打算使用标准的ADO事务,但在我的旅行中,我偶然发现了TransactionScope对象,我相信这将使我能够在一个事务中将父方法中的所有数据库交互(以及子方法中的所有交互)包装起来.
到现在为止还挺好..?
所以接下来的问题是如何在TransactionScope中创建和使用连接.我听说使用多个连接,即使它们是相同的DB也可以强制TransactionScope认为它是一个分布式事务(涉及一些昂贵的DTC工作).
是这样吗?或者,正如我似乎在其他地方读到的那样,使用相同的连接字符串(它将自己用于连接池)的情况会好吗?
更实际的是,我......
更新:
虽然看起来我可以使用我常用的.NET3.5 +和SQL Server 2008+,但是这个项目的另一部分将使用Oracle(10g),所以我不妨练习一种可以跨项目使用的技术.
所以我只是简单地将连接传递给子方法.
选项1代码示例:
using (TransactionScope ts = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.Connection.Open();
cmd.CommandType = CommandType.StoredProcedure;
try
{
//create & add parameters to command
//save parent object to DB
cmd.ExecuteNonQuery();
if ((int)cmd.Parameters["@Result"].Value != 0)
{
//not ok
//rollback transaction
ts.Dispose();
return false;
}
else //enquiry saved OK
{
if …Run Code Online (Sandbox Code Playgroud) 我正在使用Dapper对数据库,其中字符串主要存储在VarChar列中.默认情况下,Dapper NVarChar在生成查询时使用参数,而我可以将我使用的每个字符串参数包装起来DbString,默认情况下使用AnsiStrings非常好并且DbString用于NVarChar案例.
我试图从改变所述小巧玲珑源的类型映射DbType.String到DbType.AnsiString然而,似乎导致IL生成的误差的参数代表(引发InvalidProgramException).
有更简单的方法吗?
更新
只是改变typeMap是不够的我也需要改变一些if (dbType == DbType.String)检查.现在它有效!