2015-01-10 2 views
1

Я сделал класс БД и использовать его в своих формах, но мой выбор Запрос не работает & DataGridView еще пустой .. Это мой класс ..Выбор запросов не работает

class ConnectDB 
{ 
    private SqlConnection xconn; 

    public ConnectDB() 
    { 
     xconn = new SqlConnection(new StreamReader("ConnectionDB.txt").ReadLine()); 
    } 

    public void DMLOperations(string Query) //Execute Queries e.g Insert | Update Delete 
    { 
     xconn.Open(); 
     new SqlCommand(Query,xconn).ExecuteNonQuery(); 
     xconn.Close(); 
    } 
    public DataTable GetData(string SelectQuery) 
    { 
     DataTable xdata = new DataTable(); 
     new SqlDataAdapter(SelectQuery,xconn); 
     return xdata; 
    } 
    public void CloseDB() 
    { 
     xconn.Dispose(); 
    } 
    } 

& это мой method который не работает

private void btnSearch_Click(object sender, EventArgs e) 
    { 
     string batch = Batch.Text; 
     xDB.GetData("Select * from Students Where batch ='" + batch + "' "); 
     dataGridView1.DataSource = xDB.GetData("Select * from Students Where batch ='"+batch+"' "); 
     Batch.Clear(); 
     Batch.Focus(); 
    } 

ответ

1

Вы забыли заполнить свой стол.

public DataTable GetData(string SelectQuery) 
{ 
    using(var da = new SqlDataAdapter(SelectQuery,xconn)) 
    { 
     DataTable xdata = new DataTable(); 
     da.Fill(xdata); 
     return xdata; 
    } 
} 
+0

Большое спасибо. Это работает :) –

+0

@ DaniyalRaja, если его ответ помог вам пометить его как правильно. – mybirthname

0

Во-первых, не используйте один 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, в котором вы будете выполнять свой уровень доступа к данным.

+0

У вас в классе 'SqlManager' есть множество проблем. Вот несколько: 1) Ваш класс не имеет гражданства, поэтому он должен быть статичным. 2) 'GetSqlConnection()' будет вызывать NRE. 3) 'catch {throw;}' не имеет смысла. .... –

+0

Вы правы в GetSqlConnection() Я удаляю его, для других вещей я так не думаю. – mybirthname

+0

Можете ли вы рассказать мне значение 'catch {throw;}'? Также вы можете опубликовать свой код на 'http: // codereview.stackexchange.com /' и читать комментарии от других людей. –

Смежные вопросы