存储过程与引用链接服务器

时间:2013-04-10 09:50:41

标签: sql-server-2008 tsql c#-4.0 stored-procedures linked-server

我正在使用引用的linkedserver与存储过程作斗争。链接服务器可通过端口转发通过互联网访问 - 因此没有VPN,LAN。

服务器双方 MS SQL SERVER 2008 EE v.10.0.5512

配置链接服务器,DTC:

无法插入图片:(

enable promotion of distributed transaction = false
RPC = false
RPC out = false

Network DTC Access checked
Allow inbound true
Allow outbound true
No authentication Required

存储过程看起来像

CREATE PROCEDURE [dbo].[spSynchronizeArticles] 
    -- Add the parameters for the stored procedure here
(
    @pDebug bit,
    @siteId bigint
)
AS
BEGIN

  SELECT *
  FROM [LinkedServer].[MyDatabase].dbo.Storages 
  WHERE Storage.siteId = @siteId

  RETURN 0

END

你在这里看不到任何交易。如果我是正确的,MS DTC每次调用链接服务器时都会创建事务。

我从c#这样调用这个程序

  SqlCommand sqlCmd = new SqlCommand("spSynchronizeArticles");
  sqlCmd.CommandType = CommandType.StoredProcedure;
  sqlCmd.Parameters.AddWithValue("@pDebug", false);
  sqlCmd.Parameters.AddWithValue("@siteId", siteId);

  SqlParameter returnValue = new SqlParameter("returnVal", SqlDbType.Int);
  returnValue.Direction = ParameterDirection.ReturnValue;
  sqlCmd.Parameters.Add(returnValue);

  using (SqlConnection conn = new SqlConnection(Context.LocalData.ConnectionString))
  {
    try
    {
      try
      {
        conn.Open();
        sqlCmd.Connection = conn;
        sqlCmd.ExecuteScalar();

        return Convert.ToInt32(returnValue.Value);
      }
      catch (Exception ex)
      {
        //log exception to file
        return -1;
      }
    }
    finally
    {
      conn.Close();
    }
  }
}

在同步数据时,无限调用此c#代码。在同一个线程中,还有另一种方法,即从文件中获取数据(如果存在)并将它们保存到本地数据库。

SynchronizeArticles方法更频繁地调用并且一切正常,但是一旦调用了从文件获取数据的方法,SynchronizeArticles总是抛出此异常

  

System.Data.SqlClient.SqlException(0x80131904):服务器上的MSDTC   “LocalServer \ SQLEXPRESS2008”不可用。

该方法使用Transaction,看起来像

public void FillDataFromViewWithTrans(DataTable dt, string wherePhrase)
    {
      dt.Rows.Clear();
      SqlCommand sql = new SqlCommand(String.Format(@"SELECT * 
FROM SomeView
{0}", String.IsNullOrEmpty(wherePhrase) ? String.Empty : "WHERE " + wherePhrase));


      using (SqlConnection conn = new SqlConnection(Context.LocalData.ConnectionString))
      {
        SqlTransaction trans = null;
        try
        {
          try
          {
            conn.Open();
            trans = conn.BeginTransaction(IsolationLevel.RepeatableRead);
            sql.Transaction = trans;
            sql.Connection = conn;

            SqlDataAdapter dA = new SqlDataAdapter(sql);

            dA.Fill(dt);

            trans.Commit();
          }
          catch (Exception ex)
          {
            trans.Rollback();
            //log exception to file
            return;
          }
        }
        finally
        {
          conn.Close();
        }
      }
    }

这只是插图样本:)

告诉我我错过了什么。

此外,我遇到了各种错误的MS DTC的麻烦

  1. 当某些用户手动调用该过程时,从C#代码中有时会出现异常:
  2.   

    由于OLE DB提供程序无法执行此操作   'SQLOLEDB'无法开始分布式事务。

    1. 当我把begin distributed transaction放在我得到的存储过程中时:
    2.   

      警告:致命错误8510发生在2013年4月10日上午9:07。请注意   错误和时间,并与您的系统管理员联系。

      唯一有用的是重启Windows服务或UI应用程序。从 MS SQL管理工作室程序始终可以正常工作。没有问题。

      现在我必须说我很绝望,我错过了什么?

      修改

      int i = 0;
            while (true)
            {
              i++;
              if ((i % 9) == 0)
              {
                //local select with transaction Works all the time
                CallLocalSelectWithTransaction(); 
              }
      
              // CallProcedure works 8 times, after first calling of CallLocalSelectWithTransaction
              // the callProcedure works no more.
      
              CallProcedure(); // procedure with linked server
            }
      

0 个答案:

没有答案