#c# #odbc #database-connection
#c# #odbc #подключение к базе данных
Вопрос:
У меня есть вопрос о соединении, которое я создаю в коде C #
Для чтения данных я написал Factory Class для всего чтения, который выглядит следующим образом
Public static OracleDataReader(CommandType ct,string command,params OracleParameter[] cp)
{
OracleConnection cn = new OracleConnection(getconnection());
try
{
return ExecuteReader(cn,ct,command,cp);
}
catch
{
cn.close();
}
}
Теперь я использую его следующим образом
qry = "select * from emp";
using(IDataReader dr = OracleFacoty.ExecuteReader(CommandType.Text,qry,null)
{
while(dr.read())
{
//Do operation
}
}
Теперь мой вопрос в том, будет ли соединение, открытое в заводском методе, автоматически закрыто, или мне нужно передать соединение из вызывающего метода и закрыть соединение, как только я закончу чтение данных.
Ответ №1:
Оператор using правильно удалит соединение с БД, когда оно будет создано в нем. проверьте это из msdn относительно такого подхода, как вы сделали
Вы можете создать экземпляр объекта resource, а затем передать переменную в оператор using, но это не лучшая практика. В этом случае объект остается в области видимости после того, как управление покинет блок using, даже если у него, вероятно, больше не будет доступа к его неуправляемым ресурсам. Другими словами, он больше не будет полностью инициализирован. Если вы попытаетесь использовать объект вне блока using, вы рискуете вызвать исключение. По этой причине, как правило, лучше создать экземпляр объекта в операторе using и ограничить его область действия блоком using .
Я бы предложил, вероятно, использовать using и создать экземпляр connection и передать этот экземпляр вашим заводским методам для выполнения любых операций, по завершении using затем правильно удалит соединение с базой данных.
https://msdn.microsoft.com/en-us/library/yh598w02.aspx
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection (v = против 110).aspx
Комментарии:
1. но я не создаю соединение в инструкции using? будет ли по-прежнему прерываться соединение с объектом Ireader
2. не понял, что вы не создавали экземпляр соединения внутри, используя я отредактировал ответ.
Ответ №2:
Глядя на ваш код, я могу сказать
- У вас есть статический метод в классе, который создает новое соединение каждый раз, когда вы его вызываете, и возвращает некоторый объект с данными (?)
- Всякий раз, когда внутри возникает ошибка
ExecuteReader()
, исключение подавляется, и соединение закрывается без вопросов.
Но во втором фрагменте вы не используете OracleDataReader
прямой вызов ExecuteReader()
, который, как я полагаю, не будет обрабатывать никаких исключений.
Кроме того, в первом фрагменте соединение закрывается только при возникновении ошибки. Если ошибки нет, соединение не закроется и вызовет утечки памяти, и после некоторых попыток оно превысит пределы подключения.
Если вам нужно новое соединение для каждого вызова, затем поместите блок Cn.close()
in finally{}
.