Во-первых, не используйте один Connection
, Connection pooling
твой друг!
Пул соединений пулов уменьшает количество новых подключений . Пулёт сохраняет право собственности на физическое соединение . Он управляет соединениями, поддерживая живой набор активных соединений для каждой конкретной конфигурации соединения. Всякий раз, когда пользователь вызывает «Открыть» в соединении, пул ищет доступное соединение в пуле. Если объединенное соединение доступно, оно возвращает его вызывающему абоненту вместо открытия нового соединения. Когда приложение вызывает Close на соединении, пул возвращает его в объединенный набор активных соединений вместо его закрытия. Как только соединение будет возвращено в пул, он будет готов к повторному использованию по следующему открытому вызову .
Вот полная статья о Connection pooling
Как построить свой уровень доступа к данным:
public class SqlManager
{
public static string ConnectionString
{
get
{
return ConfigurationManager.ConnectionStrings["DevConnString"].ConnectionString;
}
}
public static SqlConnection GetSqlConnection(SqlCommand cmd)
{
if (cmd.Connection == null)
{
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();
cmd.Connection = conn;
return conn;
}
return cmd.Connection;
}
public static int ExecuteNonQuery(SqlCommand cmd)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
return cmd.ExecuteNonQuery();
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
public static object ExecuteScalar(SqlCommand cmd)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
return cmd.ExecuteScalar();
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
public static DataSet GetDataSet(SqlCommand cmd)
{
return GetDataSet(cmd, "Table");
}
public static DataSet GetDataSet(SqlCommand cmd, string defaultTable)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
DataSet resultDst = new DataSet();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(resultDst, defaultTable);
}
return resultDst;
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
public static DataRow GetDataRow(SqlCommand cmd)
{
return GetDataRow(cmd, "Table");
}
public static DataRow GetDataRow(SqlCommand cmd, string defaultTable)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
DataSet resultDst = new DataSet();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(resultDst, defaultTable);
}
if (resultDst.Tables.Count > 0 && resultDst.Tables[0].Rows.Count > 0)
{
return resultDst.Tables[0].Rows[0];
}
else
{
return null;
}
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
}
В этом простом доступе к данным слоя мы имеем 4 основных методов: ExecuteNonQuery
, ExecuteScallar
, GetDataSet
, GetDataRow
, Для работы с ними вам необходимо указать SqlCommand
в качестве параметра.
Параметры третьего использования SqlCommand
Это поможет SQL Server кэшировать запросы, а также предотвратить SqlInjection. Если вы не знаете, что такое Sql Injection, проверить эту статью: SqlInjection
наконец-то, как ваш код будет выглядеть с DataAccessLayer:
private void btnSearch_Click(object sender, EventArgs e)
{
string batch = Batch.Text;
SqlCommand cmd = new SqlCommand(@"
SELECT
*
FROM
Student
WHERE
[email protected]");
DataSet dst = SqlManager.GetDataSet(cmd);
dataGridView1.DataSource = dst.Tables[0];
Batch.Clear();
Batch.Focus();
}
Имейте в виду, что это не хорошая практика, чтобы выполнить доступ к данным в GUI часть вашего проекта. Лучше использовать Business Layer, в котором вы будете выполнять свой уровень доступа к данным.
Большое спасибо. Это работает :) –
@ DaniyalRaja, если его ответ помог вам пометить его как правильно. – mybirthname