如何避免MSDTC

时间:2014-04-15 19:16:00

标签: c# tsql stored-procedures msdtc sql-server-2008-express

我希望在两个SQL Server 2008 Express Edition之间同步数据。我想避免将SQL查询升级到MS DTC服务(MS DTC服务未运行)。对于同步,我使用没有事务的存储过程。

我有更多的存储过程。从链接服务器下载数据然后将其存储到本地数据库的过程可以正常工作。

我正在使用存储过程将数据上传到链接服务器。在内存存储过程中我没有使用任何事务。

当我从SQL Management Studio运行存储过程时,数据会正确上传到服务器。但是当我从.NET 4.0 C#代码调用此过程时,它最终会出现错误

  

8501 - 服务器上的MSDTC' compName \ SQLEXPRESS2008'不可用。

应用程序代码中没有使用任何事务。有时甚至从代码上传数据。我无法弄清楚何时需要MSDTC。

为什么在没有使用交易时需要MSDTC?

EDIT1:

我进展甚微。此代码用于调用存储过程。第一次调用该过程时,数据会正确上载到服务器。下次以8501异常结束。

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

  // Return value as parameter
  SqlParameter returnValue = new SqlParameter("returnVal", SqlDbType.Int);
  returnValue.Direction = ParameterDirection.ReturnValue;
  sqlCmd.Parameters.Add(returnValue);

  try
  {

      using (SqlConnection conn = new SqlConnection(dbConnection.ConnectionString))
      {
        conn.Open();
        sqlCmd.Connection = conn;
        sqlCmd.ExecuteScalar();
        sqlCmd.Dispose();
        conn.Close();
      }

    if (Convert.ToInt16(returnValue.Value) == 1)
      LogError("error while sending");

    return Convert.ToInt16(returnValue.Value) == 0;
  }
  catch (Exception ex)
  {
    Log(ex);
    return false;
  }

1 个答案:

答案 0 :(得分:0)

你为什么要自己管理同步?

为什么不使用SQL SERVER 2008 Express内置的内置复制功能?

http://technet.microsoft.com/en-us/library/ms165686(v=sql.105).aspx

这将允许您在数据库之间进行推送和拉动以使它们保持同步。