идеальный способ подключения к базе данных? - PullRequest
3 голосов
/ 23 февраля 2011
public class SqlHelper
{
public SqlHelper()
{
}
public static SqlConnection GetConnection()
{
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" +     System.Web.HttpContext.Current.Server.MapPath(@"~\App_Data\learn.mdf") + ";Integrated Security=True;User Instance=True";
    return conn;
}
public static SqlDataReader ExecuteReader(string sql)
{
    SqlConnection con = GetConnection();
    con.Open();
    SqlCommand cmd = new SqlCommand(sql, con);
    SqlDataReader dr = null;
    try
    {
        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }
    catch
    {
        con.Close();
        return null;
    }
    return dr;
}
public static Object ExecuteScalar(string sql)
{
    SqlConnection con = GetConnection();
    con.Open();
    SqlCommand cmd = new SqlCommand(sql, con);
    Object val = null;
    try
    {
        val = cmd.ExecuteScalar();
    }
    catch
    {
        con.Close();
        return null;
    }
    finally
    {
        con.Close();
    }
    return val;

}
public static DataSet ExecuteDataSet(string sql)
{
    SqlConnection con = GetConnection();
    SqlCommand cmd = new SqlCommand(sql, con);
    DataSet ds = new DataSet();
    SqlDataAdapter adapt = new SqlDataAdapter(cmd);
    try
    {
        adapt.Fill(ds);
    }
    catch
    {
        con.Close();
    }
    return ds;
}
public static void ExecuteNonQuery(string sql)
{
    SqlConnection con = GetConnection();
    con.Open();
    SqlCommand cmd = new SqlCommand(sql, con);
    try
    {
        cmd.ExecuteNonQuery();
    }
    finally
    {
        con.Close();
    }
}
}

Это класс, который я использую для реализации каждого доступа к моей базе данных.Но я думаю, что способ соединения с базой данных несколько преувеличен, потому что мне приходится нажимать кнопку Connect каждый раз, когда мне что-то нужно.Как и другие пользователи, собирающиеся сделать то же самое, что убивает производительность.
Итак, каков идеальный способ соединения с базой данных - и оставаться на связи, если это лучше.Обратите внимание, что я использую базу данных на многих страницах!
Спасибо

Ответы [ 5 ]

4 голосов
/ 23 февраля 2011

Во-первых, вы должны использовать операторы «using», чтобы убедиться, что все ваши объекты ADO.NET правильно удалены в случае сбоя:

public static void ExecuteNonQuery(string sql) 
{     
    using(var con = GetConnection())
    {
        con.Open();     
        using(var cmd = new SqlCommand(sql, con))
        {         
            cmd.ExecuteNonQuery();     
        }     
    }
}

Однако, сказав это, я не вижу проблемы с этим подходом. Преимущество состоит в том, что соединения, команды, адаптеры и тому подобное корректно удаляются каждый раз, когда вы выполняете немного SQL. Если бы вы создавали один статический экземпляр SqlConnection, вы бы повысили вероятность того, что соединение уже используется (например, при переборе содержимого SqlDataReader).

Если вы действительно обеспокоены этим, укажите перегрузки, которые принимают соединение в качестве дополнительного параметра:

public static void ExecuteNonQuery(string sql, SqlConnection connection) 
{     
    using(var cmd = new SqlCommand(sql, con))
    {         
        cmd.ExecuteNonQuery();     
    }     
}

Таким образом, абоненты могут либо выполнить немного SQL, который не требует нескольких вызовов, либо они могут вызвать ваш GetConnectionMethod для получения соединения и передать его нескольким вызовам.

0 голосов
/ 17 марта 2017

Сначала вы можете написать отдельный класс, например:

Get метод для получения данных (с запросом Select) и Set метод для манипулирования данными (вставка, обновление, удаление)

using System.Data;
using System.Data.Odbc;
using System.Data.SqlClient;  //using this you can replace instead odbc to sql

// Example SqlCommand, SqlDataAdapter
class DataBaseConnection
{
    private OdbcConnection conn1 = new OdbcConnection(@"FILEDSN=C:/OTPub/Ot.dsn;" + "Uid=sa;" + "Pwd=otdata@123;"); //"DSN=Ot_DataODBC;" + "Uid=sa;" +  "Pwd=otdata@123;"

    //insert,update,delete
    public int SetData(string query)
    {
        try
        {
            conn1.Open();
            OdbcCommand command = new OdbcCommand(query, conn1);
            int rs = command.ExecuteNonQuery();
            conn1.Close();
            return rs;
        }

        catch (Exception ex)
        {
            conn1.Close();
            throw ex;
        }

    }

    //select
    public System.Data.DataTable GetData(string sql)
    {
        try
        {

            conn1.Open();
            OdbcDataAdapter adpt = new OdbcDataAdapter(sql, conn1);
            DataTable dt = new DataTable();
            adpt.Fill(dt);
            conn1.Close();
            return dt;

        }
        catch (Exception ex)
        {
            conn1.Close();
            throw ex;


        }


    }


}

в вашей форме вы можете создать объект для этого класса соединения с базой данных

   DataBaseConnection db = new DataBaseConnection();

теперь вы можете вызывать get set с помощью метода get set следующим образом

string sqlSpecialHoliyday = "SELECT * FROM  Holiday WHERE   Date_Time='" + selectdate + "' AND  IDH='50'"; 
                DataTable dtAdditionalholily = db.GetData(sqlSpecialHoliyday);

AD вы можете установить данные, используя метод Set

string insertloginlog = "INSERT INTO Login_Log (Service_No, Machine_Name) VALUES   ('" + serviceID + "','" + machiname + "')";
                int ret = db.SetData(insertloginlog);

Надеюсь, это поможет!

0 голосов
/ 23 февраля 2011

Одна вещь, которую ВЫ можете принять во внимание, это шаблон Dependency Injection и некоторый контроллер IoC. Если каждая страница должна иметь это соединение, сделайте это свойство инъекционным (конструктор, вероятно, не будет работать, если вы не реализуете какие-то классы инфраструктуры, такие как Request), используйте некоторый контейнер (Unity, Castle, StructureMap), чтобы упаковать необходимые вещи (возможно, кеш, возможно, некоторые другие вещи), и пусть контейнер сотворит магию (под магией я подразумеваю тонны шаблонного кода) для Вас. * 1001 Лука *

0 голосов
/ 23 февраля 2011

Поддержание соединения с базой данных является задачей пула соединений, а не потребителя соединения.Лучше всего как можно позже установить соединение и освободить его как можно скорее.

using(var connection = new SqlConnection(YourConnectionStringHelperFunction())
{

}
0 голосов
/ 23 февраля 2011

Если это используется для веб-сайта, то вы должны учитывать, что между запросами страниц, даже из одного и того же браузера, состояние вашего сервера будет ухудшаться (в общих чертах), поэтому на самом деле ничего не получится от попыток поддерживать соединение SQL между страницами. Это первое.

Если каждая страница является результатом одного соединения с базой данных, то вы, вероятно, оптимизированы настолько, насколько это действительно необходимо, если вы делаете несколько соединений в течение генерации страницы, тогда вы можете захотеть посмотреть, как соединение остается живым пока вы не закончили извлечение данных; либо поддерживая соединение, либо оптимизируя поиск данных, чтобы ограничить возможности пересылки между вашим приложением и БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...