В попытке закрыть мой вопрос о соединениях, которые остаются открытыми и превышают максимальный пул , я пытаюсь переписать функцию, которая используется для подключения к нашей базе данных.
Функция существует в доморощенной скомпилированной библиотеке.используя отражатель, я вижу, что код выглядит следующим образом:
public SqlProvider([Optional, DefaultParameterValue("")] string StrConnection)
{
string str;
if (StrConnection == "")
{
str = ConfigurationSettings.AppSettings["ConStr"];
}
else
{
str = StrConnection;
}
SqlConnection connection = new SqlConnection(str);
connection.Open();
this.MyCommand = new SqlCommand();
SqlCommand myCommand = this.MyCommand;
myCommand.Connection = connection;
myCommand.CommandType = CommandType.Text;
myCommand = null;
this.MyDataAdapter = new SqlDataAdapter(this.MyCommand);
this.MyCommandBuilder = new SqlCommandBuilder(this.MyDataAdapter);
this.MyDataSet = new DataSet();
}
Я планирую изменить это, чтобы прочитать
public SqlProvider([Optional, DefaultParameterValue("")] string StrConnection)
{
string str;
if (StrConnection == "")
{
str = ConfigurationSettings.AppSettings["ConStr"];
}
else
{
str = StrConnection;
}
using (SqlConnection connection = new SqlConnection(str))
{
connection.Open();
this.MyCommand = new SqlCommand();
SqlCommand myCommand = this.MyCommand;
myCommand.Connection = connection;
myCommand.CommandType = CommandType.Text;
myCommand = null;
this.MyDataAdapter = new SqlDataAdapter(this.MyCommand);
this.MyCommandBuilder = new SqlCommandBuilder(this.MyDataAdapter);
this.MyDataSet = new DataSet();
}
}
, а затем перекомпилировать dll.Учитывая, что экземпляр SQLProvider()
обычно создается в верхней части открытого класса, а затем этот экземпляр используется внутри членов класса (например:
public class Banner
{
DSLibrary.DataProviders.SqlProvider db = new DSLibrary.DataProviders.SqlProvider(Defaults.ConnStr);
public Banner()
{
}
public DataTable GetBannerImages(string bannerLocation,int DeptId)
{
using (DSLibrary.DataProviders.SqlProvider db = new DSLibrary.DataProviders.SqlProvider(Defaults.ConnStr))
{
DataTable dt = new DataTable();
//Add Parameter @BannerLocation for Banner of Specific Location
//Call proc_getBannerImages Stored procedure for Banner Images
db.AddStoredProcParameter("@BannerLocation", SqlDbType.VarChar, ParameterDirection.Input, 100, bannerLocation);
db.AddStoredProcParameter("@DeptId", SqlDbType.Int, ParameterDirection.Input, 0, DeptId);
dt = db.ExecuteStoredProcedure("proc_getBannerImages");
return dt;
}
}
}
Правильно ли я это делаю?Мне кажется, что соединение будет удалено до того, как данные будут фактически извлечены. Кроме того, Visual Studio сообщает мне, что SQLProvider()
должен быть неявно конвертируемым в System.IDisposable
- как мне поступить в реализации этого?
Я попытался обернуть все элементы class Banner
в оператор using (DSLibrary.DataProviders.SqlProvider db = new DSLibrary.DataProviders.SqlProvider(Defaults.ConnStr)){}
, но intellisense затем отображает ошибку "Недопустимый токен, использующий" в объявлении члена класса, структуры или интерфейса ".
Что является лучшим способомчтобы пойти по этому поводу?
ОБНОВЛЕНИЕ Я пытался разобрать, настроить и перекомпилировать DSLibrary, но, как говорит CHris_Lively, я думаю, что это ничего не делает для меня. Изменение рассматриваемого экземпляра на то, что я получаюболее стандартный формат работает до сих пор:
public DataTable GetBannerImages(string bannerLocation,int DeptId)
{
using (SqlConnection conn = new SqlConnection(Defaults.ConnStr))
{
SqlCommand cmd = new SqlCommand("proc_getBannerImages", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@BannerLocation", bannerLocation));
cmd.Parameters.Add(new SqlParameter("@DeptId", DeptId));
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
Я собираюсь заглянуть в библиотеку Enterprise, кажется, что это может бытьпуть вперед.