2

このコードは Transaction.cs にあります

using (TransactionScope scope = new TransactionScope())
{
        // Setup nhibernate configuration
        Configuration config = new Configuration();            
        config.SetProperty("hibernate.connection.connection_string", GlobalVar.TRUECONNSTRING);
        config.SetProperty("hibernate.command_timeout", "3600");
        config.AddAssembly(typeof(ProductionMovein).Assembly);

        // Setup nhibernate session
        ISessionFactory factory = config.BuildSessionFactory();
        ISession session = factory.OpenSession();
        ITransaction transaction = session.BeginTransaction();

        //Recalculate Number
        PairData pairCabang = (PairData)comboCabang.SelectedItem;
        textNo.Text = FormFunction.getNumber(2, pairCabang.key, dtpTanggal.Value);

        // Insert data
        try
        {
            //ProductionMoveIn
            ProductionMovein productionMoveIn = new ProductionMovein();
            productionMoveIn.Nomor = textNo.Text;
            session.Save(productionMoveIn);    

            transaction.Commit();
            session.Close();
        }
        catch (Exception ex)
        {
            transaction.Rollback();
            session.Close();
            MessageBox.Show(ex.InnerException.Message);
            return 1;
        }

    scope.Complete();
}

そして、エラーはから始まります

textNo.Text = FormFunction.getNumber(2, pairCabang.key, dtpTanggal.Value);

Formfunction.csにこのコードがあります

public static string getNumber(int formID, int cabangID, DateTime date)
{
    string formNumber = "";
    string strQuery = "";

        formNumber += formNames[formID, 0] + "/" + + date.ToString("yy") + date.ToString("MM") + "/";

    // Setup nhibernate configuration
    NHibernate.Cfg.Configuration config = new NHibernate.Cfg.Configuration();        
        config.SetProperty("hibernate.connection.connection_string", GlobalVar.TRUECONNSTRING);
        config.SetProperty("hibernate.command_timeout", "3600");
    config.AddAssembly(typeof(Login).Assembly);

    //// Setup nhibernate session
    ISessionFactory factory = config.BuildSessionFactory();
    ISession session = factory.OpenSession();

            strQuery = "SELECT MAX(REVERSE(SUBSTRING(REVERSE(a.Nomor), 1, 5))) as 'latest' FROM " + formNames[formID, 1] +
                   " a WHERE a.cabang = " + cabangID +
                   " AND YEAR(a.tanggal) = '" + date.ToString("yyyy");

    Object result = session.CreateSQLQuery(strQuery)
        .AddScalar("latest", NHibernateUtil.Int32)
        .UniqueResult();
    session.Close();

    int nRow;
    if (result == null)
        nRow = 0;
    else
        nRow = (int)result;
    formNumber += (nRow + 1).ToString("d5");

    return formNumber;
}

サーバーを 10.10.7.10 (私の IP) に変更しようとしましたが、うまくいきました。しかし、他のIPに変更すると、接続を開くことができません。自分のコンピューターと接続しようとした他のサーバーで msdtc をオンにしようとしましたが、それでも同じエラーが発生します。 ここに画像の説明を入力

ここに画像の説明を入力

このエラーを解決する方法を教えてもらえますか?

4

1 に答える 1

2

どのデータベースを使用していますか? (私はMS SQLを想定しています)例外の詳細を投稿していただけますか?

これがアプローチです。

  1. using (TransactionScope)最初に/をコメントアウトしscope.Complete 、リモート データベースへの接続を試みます。つまり、ローカル SQL クライアントが TCP/IP 用に構成されていること、リモート サーバーがリモート TCP/IP 接続 (通常はポート 1433) を許可していること、およびログイン資格情報とアクセスが許可されていることを確認します。は正しい。
  2. DTC は通常、2 つ以上の接続が使用されている場合にのみ必要です。TransactionScope を元に戻し、その後 NHibernate トランザクションを削除すると、DTC がまったく必要なくなる可能性があります。また、TransactionScopes のデフォルトは Read Serializable 分離​​ - TransactionScope 関数であることに注意してください。
  3. リモート接続などを許可するために、PC とサーバーの両方で DTC が構成されていることを確認します写真

    ファイアウォールの問題にも取り組む必要があります DTC ファイアウォールの要件ですか?

編集

デフォルトでは、SQL Express はリモート接続に対して開かれていません。リモート サーバーでは、SQL 構成マネージャーで TCP/IP を有効にし、1433/1434 のファイアウォールを開く必要があります。@Özgür が言及しているように、SQL がブラウザ サービスが実行されている (またはインスタンス名を変更するか、接続文字列を変更して ip、port を使用する)。詳細はこちら: http://www.sevenforums.com/system-security/58817-remote-access-sql-server-express-2008-windows-7-a.html

于 2012-04-10T03:43:43.833 に答える