2015-07-09 3 views
0

Мне бы очень хотелось, чтобы некоторые советы по этому поводу, поскольку я столкнулся с этой проблемой совсем немного. У меня есть несколько приложений, как больших, так и маленьких, где мне нужно сделать некоторую работу с Netezza. К сожалению, это типичная проблема с .net и Netezza, Netezza принимает команду sql, выполняет ее (я подтвердил ее в журнале), но периодически не отправляет обратную ссылку, а мое соединение OLEDB в моем приложении C# просто сидит там и временами. В журнале Netezza я также вижу, что моя сессия просто сидит там открыто, потому что мое приложение все еще ждет, когда NZ отправит что-то обратно. Это происходит только при соединении, которое выполняет более 1 команды.C# SQL вставить в Netezza. Netezza не отправляет возврат, C# код тайм-аут

В любом случае, ниже приведен код, и я хочу получить совет относительно того, как смягчить эту проблему. Я в настоящее время, но в числе повторных попыток, но мне бы очень хотелось, чтобы что-то было более безопасным. Кто-нибудь имеет какие-либо советы о том, как справиться с такой проблемой, когда вы не можете получить возврат?

Этот конкретный цикл составляет около 135 записей, и требуется только 1 минута. Отсутствие возврата не связано с какой-либо конкретной записью. Это совершенно случайно и происходит и в других приложениях.

Любой совет будет оценен! Спасибо!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data; 
using System.Data.OleDb; 
using System.Data.Sql; 
using System.Data.SqlTypes; 
using System.Data.SqlClient; 
using System.Security.Cryptography; 
using System.IO; 

namespace RemoveVoidedInvoices 
{ 
class UpdateNetezza 
{ 
    public bool NetezzaWorkFailure = false; 

    private void NetezzaWorkFailed() 
    { 
     NetezzaWorkFailure = true; 
    } 

    public void updateCounts(List<RecordCounts> recordCounts) 
    { 

     string connString = string.Format("Provider=NZOLEDB;Data Source={0};Initial Catalog=EBIDW;User ID=MYUSERNAME;Password={1}", Environment, passWord); 

     OleDbConnection netezzaConn = null; 

     //Due to timeout issues I am making a quick timespan entry so that I can keep track in the log of how long each day the bulk update took 
     DateTime Prequery = DateTime.Now; 
     int retrycount = 0; 

     try 
     { 
      netezzaConn = new OleDbConnection(connString); 
      netezzaConn.Open(); 

      for (int i = 0; i < recordCounts.Count; i++) 
      { 
       try 
       { 
        if (recordCounts[i].RecordCount.ToString() != recordCounts[i].OrigCount.ToString()) 
        { 
         string updateStatement = string.Format("UPDATE fct_ourtable SET LINESWRITTENTOFILE = {0} where EXTRACTFILENAME = '{1}' and LINESWRITTENTOFILE = {2}", recordCounts[i].RecordCount.ToString(), recordCounts[i].FileName, recordCounts[i].OrigCount.ToString()); 

         Console.WriteLine("Executing query : " + updateStatement); 
         Console.WriteLine("Query start-time - " + DateTime.Now.ToString()); 

         OleDbCommand exe = new OleDbCommand(updateStatement, netezzaConn); 
         exe.CommandTimeout = 2000; 

         int rowsUpdated; 

         rowsUpdated = exe.ExecuteNonQuery(); 

         Console.WriteLine("Rows Updated = " + rowsUpdated.ToString()); 
         Console.WriteLine("Query end-time - " + DateTime.Now.ToString()); 
         Console.WriteLine(); 

        } 

        else 
        { 
         Console.WriteLine("No records were removed from the file : " + recordCounts[i].FileName + ". Not updating Netezza."); 
         Console.WriteLine(); 
        } 
       } 

       catch (OleDbException oledbex) 
       { 
        retrycount++; 

        if (retrycount > 3) 
        { 
         Console.WriteLine("Maximum number of retrys met. Canceling now."); 
         throw new System.Exception(); 
        } 
        else 
        { 
         i = i - 1; 
         Console.WriteLine("Timeout on Query, retrying"); 
        } 
       } 
      } 
     } 

     catch (Exception ex) 
     { 
       Console.WriteLine(ex); 
       NetezzaWorkFailed(); 
     } 

     finally 
     { 
      if (netezzaConn != null) 
      { 
       netezzaConn.Close(); 
       netezzaConn = null; 
      } 
      TimeSpan duration = DateTime.Now.Subtract(Prequery); 
      Console.WriteLine("Query Time: " + duration); 
     } 
    } 
} 
} 

ответ

0

Это может быть более подходящим в качестве комментария, но я не хватает респ.

Я не использовал OleDB много, но мы запускаем запросы аналогично тому, что вы делаете с ODBC, и у вас не было никаких проблем. Было бы интересно попробовать хотя бы.

Несколько комментариев к вашему фрагменту, что, я сомневаюсь, окажет большое влияние на вашу проблему, но поможет прояснить и сократить код.

  • Звоните Dispose вместо Close на ваше соединение.
  • Также Dispose ваш объект команды.
  • Используйте параметры вместо форматирования строки запроса (работает для OleDB и ODCB). Создайте OleDBCommand за пределами цикла и добавьте три параметра. Внутри цикла вы устанавливаете параметры Value и выполняете запрос так же, как и вы.
  • Используйте using блоков вместо try - catch, чтобы избежать явных вызовов Dispose. Вам все равно понадобится блок - catch внутри или вне блока using, если вы хотите обрабатывать исключения.
Смежные вопросы