2016-01-08 2 views
0

Я посмотрел несколько потоков на стек и не смог найти ответ на этот вопрос.Консоль App Hangs после открытия 108 DB Connections

У меня есть приложение, которое открывает соединение SQL, делает запрос, сравнивает строку, а затем выводит либо ретрансляцию сообщения, либо существует элемент во втором приложении.

Приложение застревает на одном и том же значении каждый раз «J2y7W0Q1Tn» (этот элемент существует в БД), когда я приостанавливаю его. Visual studio сообщает мне connAm.Open(); будет работать дальше ... Я использовал инструкцию using, но мне нужны мои переменные, которые будут доступны за пределами этой области.

Я устал, чтобы упростить это как можно больше и по-прежнему включать в себя то, что может быть необходимо.

using System; 
using System.IO; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using AcumaticaRoundRobin.RoundRobin; 
using System.Reflection; 
using System.Globalization; 
using System.Data.SqlClient; 
using System.Diagnostics; 
using System.Threading; 

#region GetExistingTransactions 
try { 
string CleanTAccessCode = Regex.Replace(TAccessCode, "(?:[^a-zA-Z0-9 ]|(?<=['\"])s)", "%", RegexOptions.None, TimeSpan.FromSeconds(1.5)); 

SqlConnection connAM = new SqlConnection(); 

connAM.ConnectionString = @"Data Source=myendpoint, 1433;Initial Catalog=DB;User Id=******;Password=***;Trusted_Connection=False;MultipleActiveResultSets=true;Connection Timeout=200000"; 
connAM.Close(); // Closing Connections that may still be open from last loop 
connAM.Open(); //Open new connection 
SqlCommand AccessCodeResult = new SqlCommand("SELECT [UsrAccessCode] FROM [AmSecureClose].[dbo].[PMTran] WHERE CompanyID = 3 AND UsrAccessCode LIKE '" + CleanTAccessCode + "'", connAM) 

    SqlDataReader AccessCodeResults = AccessCodeResult.ExecuteReader(); 
      if (AccessCodeResults.HasRows) { 
      while (AccessCodeResults.Read()) { 
      string FlatUseResult = AccessCodeResults.IsDBNull(0) ? string.Empty : AccessCodeResults.GetString(0); 

              #endregion 

if (FlatUseResult.Equals(TAccessCode, StringComparison.OrdinalIgnoreCase)) 
                 { 

                  Console.WriteLine(TAccessCode + " Exists Move to Next"); 
                  //connAM.Close(); 

                 } 
                 else 
                 { 

                  //Jump into grid              
                  context.CT303000Clear(); 
                  CT303000Content[] CT303000result2 = context.CT303000Submit(
                   new Command[] { 
                 new Value { Value = ContractID, LinkedCommand = CT303000.Contract.ContractID }, 
                    CT303000.UnbilledTransactions.ServiceCommands.NewRow,           
                     new Value { Value = /*DB Location ID*/TLocationIds, LinkedCommand = CT303000.UnbilledTransactions.LocationId }, 
                     //new Value { Value = /*DB Location*/TLocation, LinkedCommand = CT303000.UnbilledTransactions.Location }, 
                     new Value { Value = /*DB Deal Date*/TCreateDateS, LinkedCommand = CT303000.UnbilledTransactions.Date }, 
                     new Value { Value = /*DB Access Code*/TAccessCode, LinkedCommand = CT303000.UnbilledTransactions.AccessCode }, 
                     new Value { Value = /*DB Contract Code*/TContractCode, LinkedCommand = CT303000.UnbilledTransactions.ContractCode }, 
                     //new Value { Value = /*DB Contract Vin*/TContractVin, LinkedCommand = CT303000.UnbilledTransactions.ContractVin }, 
                     new Value { Value = /*DB Buyer ID*/TBuyerIdS, LinkedCommand = CT303000.UnbilledTransactions.BuyerId }, 
                     new Value { Value = /*DB First Name*/TBuyerFName, LinkedCommand = CT303000.UnbilledTransactions.BuyerFirstName }, 
                     new Value { Value = /*DB Last Name*/TBuyerLName, LinkedCommand = CT303000.UnbilledTransactions.BuyerLastName }, 
                     //new Value { Value = /*DB Showing Sttus ID*/TStatusIdS, LinkedCommand = CT303000.UnbilledTransactions.ShowingStatusId }, 
                     new Value { Value = /*DB Presentation Status*/TPresentationStatus, LinkedCommand = CT303000.UnbilledTransactions.PresentationStatus }, 
                     //new Value { Value = /*DB Machine Name*/TKioskName, LinkedCommand = CT303000.UnbilledTransactions.KioskName }, 
                     new Value { Value = "1", LinkedCommand = CT303000.UnbilledTransactions.Quantity}, 
                     new Value { Value = InventoryId, LinkedCommand = CT303000.UnbilledTransactions.InventoryID },                    
                     CT303000.Actions.Save 
                   } 


                  ); 

                  Console.WriteLine(TAccessCode + " Has Been Created Move to Next"); 
                  //connAM.Close(); 
                 } 
                } 
               } 
              } 


             //} 
            } 
            else 
            { 
             //No transactions for contract step to next Customer 
            } 

           } 
           #endregion 
          } 
         } 
         //connPro.Close(); 
        } // End Timeout Exception 

        catch (Exception TimeoutException) 
        { 
         Console.WriteLine(TimeoutException.Message); 
         //if TimeoutException.Message 
         //Console.ReadLine(); 
         continue; 
        } 
+2

Соединения последние несколько секунд могут вызвать утечку соединений? –

+0

use [using] (https://msdn.microsoft.com/en-us/library/yh598w02.aspx) – dotctor

+1

Ваш код требует много рефакторинга. Насколько я понимаю, вы вызываете это в цикле. Это означает, что вы открываете и закрываете соединения несколько раз. Этот SQL-запрос является очень простым. Вы можете думать о сборе всех значений параметров в цикле, а затем вызывать sql для всех параметров только один раз. После того, как вы получите результаты, вы можете просмотреть результаты и отобразить значения. После прочтения всех результатов вы можете закрыть соединение. Если вам нужна дополнительная помощь, отправьте полный код. –

ответ

0

мне нужно структурировать начало этого вызова с «помощью» заявления, который содержал connAM.Open(); перед запуском второго «SQLReader» с использованием цикла запросов и сравнения.

using (SqlConnection connAM = new SqlConnection()) { // Added this above the query enclosing the second using statement. 
connAM.ConnectionString = @"Data Source=s*****, 1433;Initial Catalog=*****;User id=*****;Password=*****;Trusted_Connection=False;MultipleActiveResultSets=true;Connection Timeout=200000"; 
              SqlCommand AccessCodeResult = new SqlCommand("SELECT [UsrAccessCode] FROM [AmSecureClose].[dbo].[PMTran] WHERE CompanyID = 3 AND UsrAccessCode LIKE '" + CleanTAccessCode + "'", connAM); 
              connAM.Open(); 
              using (SqlDataReader AccessCodeResults = AccessCodeResult.ExecuteReader()) 
              { 
Смежные вопросы