【问题标题】:Cannot open connection if the server is not local如果服务器不是本地服务器,则无法打开连接
【发布时间】:2012-04-10 15:33:30
【问题描述】:

我在 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,但仍然出现相同的错误。

谁能帮我解决这个错误?

【问题讨论】:

    标签: c# nhibernate transactionscope


    【解决方案1】:

    您使用的是哪个数据库? (我假设 MS SQL) 你能发布异常详细信息吗?

    这是一种方法。

    1. 首先注释掉using (TransactionScope)/scope.Complete 并尝试连接到远程数据库 - 即确保您的 本地Sql客户端配置为TCP/IP,远程服务器允许 远程 TCP/IP 连接(通常是端口 1433),并且您的登录 凭据和访问权限正确。
    2. 通常仅在使用 2 个或更多连接时才需要 DTC。如果 您恢复 TransactionScope,然后删除 NHibernate 交易,那么可能根本不需要 DTC。另请注意 TransactionScopes 默认为 Read Serializable 隔离 - TransactionScope functions
    3. 确保在您的 PC 和服务器上都配置了 DTC 允许远程连接等 - 。

      您还需要解决防火墙问题 DTC firewall requirements?

    编辑

    默认情况下,SQL Express 不对远程连接开放 - 在远程服务器上,您需要在 SQL 配置管理器上启用 TCP/IP,为 1433 / 1434 打开防火墙,正如@Özgür 提到的,确保浏览器服务正在运行的 SQL(或更改您的实例名称,或更改您的连接字符串以使用 ip、端口)。更多信息在这里:http://www.sevenforums.com/system-security/58817-remote-access-sql-server-express-2008-windows-7-a.html

    【讨论】:

    • 我正在使用 MS SQL EXPRESS 2005。我正在使用 2 个数据库。我仅使用一个数据库制作的示例使其看起来更简单。我已经在我要连接的服务器和我的计算机中尝试了 3 号方法,但我仍然遇到同样的错误。
    • 对于 sql express,请确保 SQL Server Browser 服务正在您尝试连接的服务器上运行。
    • @NoOne 我已经更新了答案 - 您可以通过 TELNET MySQLExpressHost 1433 从命令行检查您的 SQL Express 框是否为远程连接打开。 Telnet 会告诉您它是否拒绝,或者如果它连接则允许您输入字符。
    • @nonnb 我已关闭计算机中的防火墙和我要连接的服务器计算机。我可以使用 SQL Server Management Express 连接服务器。如果我只使用一个数据库并且只连接到服务器,代码就可以正常工作。
    • 已解决。我忘记将单选按钮更改为不需要身份验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多