Я посмотрел несколько потоков на стек и не смог найти ответ на этот вопрос.Консоль 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;
}
Соединения последние несколько секунд могут вызвать утечку соединений? –
use [using] (https://msdn.microsoft.com/en-us/library/yh598w02.aspx) – dotctor
Ваш код требует много рефакторинга. Насколько я понимаю, вы вызываете это в цикле. Это означает, что вы открываете и закрываете соединения несколько раз. Этот SQL-запрос является очень простым. Вы можете думать о сборе всех значений параметров в цикле, а затем вызывать sql для всех параметров только один раз. После того, как вы получите результаты, вы можете просмотреть результаты и отобразить значения. После прочтения всех результатов вы можете закрыть соединение. Если вам нужна дополнительная помощь, отправьте полный код. –