2012-04-10 3 views
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 на моем компьютере, а другой сервер, к которому я пытался подключиться, но все равно получаю ту же ошибку. enter image description here

enter image description here

Может кто-нибудь помочь мне, как решить эту ошибку?

+0

Какое внутреннее исключение? – zmbq

ответ

2

Какую базу вы используете? (Я предполагал, что MS SQL) Можете ли вы разместить подробное описание исключения?

Вот такой подход.

  1. Первый комментарий вне using (TransactionScope)/scope.Complete и попробуйте подключиться к удаленной базе данных - то есть, чтобы убедиться, что ваш местный Sql клиент настроен для TCP/IP, удаленный сервер позволяет удаленного TCP/IP-соединений (обычно порт 1433), и что ваши учетные данные и доступ к вашему логину верны.
  2. DTC обычно требуется только при использовании двух или более соединений. Если вы восстанавливаете TransactionScope, но затем удалите транзакцию NHibernate , тогда код DTC может не потребоваться вообще. Также обратите внимание, что TransactionScopes по умолчанию для чтения Serializable изоляции - TransactionScope functions
  3. Убедитесь, что DTC настроен на обоих ПК и сервера к удаленных подключений и т.д. - picture.

    Кроме того, необходимо решать вопросы брандмауэра DTC firewall requirements?

EDIT

По умолчанию SQL Express не является открытым для удаленных соединений - на удаленном сервере, необходимо включить TCP/IP в SQL Configuration Manager, откройте брандмауэр для 1433/1434 и, как упоминает @ Özgür, убедитесь, что SQL-служба браузера запущена (или измените имя экземпляра или измените строку подключения на использование ip, port) , Подробнее об этом здесь: http://www.sevenforums.com/system-security/58817-remote-access-sql-server-express-2008-windows-7-a.html

+0

Я использую MS SQL EXPRESS 2005. Я использую 2 базы данных. В примере я делаю только одну базу данных, чтобы сделать ее более простой. Я пробовал подход номер 3 на сервере, который я хочу подключить, а также на моем компьютере, но я все равно получаю ту же ошибку. – NoOne

+2

Для службы sql express служба SQL Server Browser работает на сервере, который вы пытаетесь подключить. –

+0

@NoOne Я обновил ответ - вы можете проверить, открыт ли ящик SQL Express для удаленных подключений TELNET MySQLExpressHost 1433 из командной строки. Telnet сообщит вам, отклоняется ли он или позволяет вводить символы, если он подключается. – StuartLC

Смежные вопросы