2010-06-23 2 views
0

В моем коде ниже работает cmdquery, но hrquery этого не делает. Как получить другой запрос для заполнения вида сетки? Нужно ли устанавливать новое соединение или использовать одно и то же соединение? Можете ли вы, ребята, помочь мне? Я новичок в C# и asp. Вот несколько кодов спагетти, которые я собрал вместе. Это может быть неправильно, поэтому, если у вас есть лучший способ сделать это, не стесняйтесь делиться.Нужна помощь с подключением к базе данных и кодом запроса

if (Badge != String.Empty) 
{ 
    string cmdquery = "SELECT * from Employees WHERE Badge ='" + Badge + "'"; 
    string hrquery = "SELECT CLOCK_IN_TIME, CLOCK_OUT_TIME FROM CLOCK_HISTORY WHERE Badge ='" + Badge + "'"; 

    OracleCommand cmd = new OracleCommand(cmdquery); 
    cmd.Connection = conn; 
    cmd.CommandType = CommandType.Text; 
    conn.Open(); 

    OracleDataReader reader = cmd.ExecuteReader(); 

    while (reader.Read()) 
    { 
     this.xUserNameLabel.Text += reader["EMPLOYEE_NAME"]; 
     this.xDepartmentLabel.Text += reader["REPORT_DEPARTMENT"];    
    } 

    OracleCommand Hr = new OracleCommand(hrquery); 
    Hr.Connection = conn; 
    Hr.CommandType = CommandType.Text; 

    OracleDataReader read = Hr.ExecuteReader(); 

    while (read.Read()) 
    { 
     xHoursGridView.DataSource = hrquery; 
     xHoursGridView.DataBind(); 
    } 
} 
conn.Close(); 
+0

В чем вопрос? Если ваш код работает, что вы хотите знать? – JustLoren

+1

Не ответ на ваш вопрос, но вы действительно должны это прочитать: http://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site (в первую очередь думая об уязвимости SQL-инъекции, которой страдает ваш код). –

+0

исправил вопрос немного –

ответ

3

Ваш код доступа к данным обычно должны выглядеть следующим образом:

string sql = "SELECT * FROM Employee e INNER JOIN Clock_History c ON c.Badge = e.Badge WHERE e.Badge = @BadgeID"; 
using (var cn = new OracleConnection("your connection string here")) 
using (var cmd = new OracleCommand(sql, cn)) 
{ 
    cmd.Parameters.Add("@BadgeID", OracleDbType.Int).Value = Badge; 

    cn.Open(); 

    xHoursGridView.DataSource = cmd.ExecuteReader(); 
    xHoursGridView.DataBind(); 
} 

Обратите внимание, что это всего лишь общий шаблон. Вы захотите настроить его для ваших конкретных потребностей. Важными вещами для этого являются блоки using для правильного создания и удаления объекта соединения и параметра для защиты от SQL-инъекции.

Что касается вопроса о подключении, есть исключения, но вы можете обычно использовать соединение только для одного активного результирующего набора за раз. Итак, вы могли бы повторно использовать тот же самый conn объект из вашего исходного кода, но только после того, как вы полностью закончили его с предыдущей команды. Также хорошо открыть два соединения, если они вам понадобятся. Опция best, однако, заключается в том, чтобы комбинировать связанные запросы в одном заявлении sql, когда это возможно.

+0

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

0

Я даже не собираюсь в том, как вы должны использовать using s- и методы: р

if (Badge != String.Empty) 
    { 

     string cmdquery = "SELECT * from Employees WHERE Badge ='" + Badge + "'"; 
     string hrquery = "SELECT CLOCK_IN_TIME, CLOCK_OUT_TIME FROM CLOCK_HISTORY WHERE Badge ='" + Badge + "'"; 

     OracleCommand cmd = new OracleCommand(cmdquery); 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.Text; 
     conn.Open(); 

     OracleDataReader reader = cmd.ExecuteReader(); 


      while (reader.Read()) 
      { 
       this.xUserNameLabel.Text += reader["EMPLOYEE_NAME"]; 
       this.xDepartmentLabel.Text += reader["REPORT_DEPARTMENT"]; 

      } 


      OracleCommand Hr = new OracleCommand(hrquery); 
      Hr.Connection = conn; 
      Hr.CommandType = CommandType.Text; 


      OracleDataReader read = Hr.ExecuteReader(); 

      //What's this next line? Setting the datasource automatically 
      // moves through the data. 
      //while (read.Read()) 
      //{ 
              //I changed this to "read", which is the 
              //datareader you just created. 
       xHoursGridView.DataSource = read; 
       xHoursGridView.DataBind(); 
      //} 


    } 
    conn.Close(); 
+0

Просьба уточнить, что я хотел бы узнать, что ваше время не будет потрачено впустую. –

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