小编ser*_*hym的帖子

在t-sql中为所有用户表添加一列

我需要向数据库中的所有40个用户表添加一个删除标志列.我可以编写一个脚本来循环遍历sys.tables,但我想我会检查一下是否有人有更好的解决方案,或者预先为这个场景创建了sql.

sql t-sql sql-server database-design metadata

13
推荐指数
2
解决办法
9441
查看次数

在共享的OleDbConnection/OleDbTransaction中并行执行EntonNonQuery

发现OleDBConnection似乎不是ThreadSafe.它似乎尝试打开多个连接.

//doesn't work
using (OleDbConnection oConn = TheDataAccessLayer.GetConnection())
using (OleDbTransaction oTran = oConn.BeginTransaction())
Parallel.ForEach(ORMObjects, (ORMObject, State) =>
{

        if (!State.ShouldExitCurrentIteration && !State.IsExceptional)
        {
              var Error = ORMObject.SomethingThatExecutesANonQuery(oConn,oTran)

              if (Error.Number != 0)
                  State.Stop();

        }

});
Run Code Online (Sandbox Code Playgroud)

如果我锁定了ExecuteNonQuery的连接,那么错误就会消失,但性能却会消失.

 //works
    using (OleDbConnection oConn =  TheDataAccessLayer.GetConnection())
    using (OleDbTransaction oTran = oConn.BeginTransaction())
    Parallel.ForEach(ORMObjects, (ORMObject, State) =>
    {

            if (!State.ShouldExitCurrentIteration && !State.IsExceptional)
            {
              lock(oConn)
              {
                    var Error = ORMObject.SomethingThatExecutesANonQuery(oConn,oTran)

                if (Error.Number != 0)
                      State.Stop();
             }

            }

    });
Run Code Online (Sandbox Code Playgroud)

假使,假设

  • 我无法改变ORM的本质:SQL不能被批量化

  • 业务规则要求在单个事务中执行交互

所以:

  • 是否有更好/更有效的方法来并行化OleDb交互?

  • 如果没有,OleDb客户端是否有可以充分利用并行性的替代方案?(也许是原生的MSSQL客户端?)

c# t-sql oledb sql-server-2008 task-parallel-library

5
推荐指数
1
解决办法
3616
查看次数