2014-09-04 9 views
2

임 상태 도구를 조금 만들려고합니다. 여러 쿼리 (약 4-5)의 결과를 가져와야합니다. 일반적인 연결 설정 및 '데이터 읽기 방법'은 이미 완료되었지만 다른 쿼리가 실행 된 방법을 파악할 수 없습니다.C# Mysql 다중 쿼리

검색하는 동안 찾은 모든 것은 SqlClient입니다. 임은 이것으로 완전히 과대 평가했다. 여기

지금까지 내 코드입니다 (환자 수, 여기에 초보자 메신저) :

private void button1_Click(object sender, EventArgs e) 
     { 
      if(listView1.Items.Count > 1) 
      { 
       listView1.Items.Clear(); 
      } 
      var listMember = new List<string>{}; 
      var listOnline = new List<string>{}; 

      // SQL PART // 
      string connString = "Server=10*****;Port=3306;Database=e***;Uid=e***;password=********************;"; 
      MySqlConnection conn = new MySqlConnection(connString); 
      MySqlCommand command = conn.CreateCommand(); 
      command.CommandText = "SELECT fullname,online FROM member WHERE active = '1' ORDER BY online DESC"; 
      try 
      { 
       conn.Open(); 
      } 
      catch (Exception ex) 
      { 
       listView1.Items.Add("Error: " + ex); 
      } 
      MySqlDataReader reader = command.ExecuteReader(); 
      while(reader.Read()) 
      { 
       listMember.Add(reader["fullname"].ToString()); 
       listOnline.Add(reader["online"].ToString()); 
      } 
      conn.Close(); 
      // SQL ENDING // 

      // SET ENTRIES TO LISTVIEW // 
      int counter = 0; 
      foreach(string member in listMember) 
      { 
       ListViewItem item = new ListViewItem(new[] { member, listOnline.ElementAt(counter) }); 
       item.ForeColor = Color.Green; 
       listView1.Items.Add(item); 

       counter++; 
      } 
     } 

임 디자인/레이아웃이 결국처럼, 그래서 난 그냥을하고 싶습니다 방법을 정말 확실하지 결과를 SQL 파트의 목록에 추가하여 나중에 목록에서 데이터를 처리하십시오.

conn.Close() 이후에 완전히 새로운 연결을 설정해야합니까? 아니면 다른 방법이 있습니까? 나는 상상할 수 있습니다 : 자신의 연결을 가진 5 개의 쿼리, 시도, catch 및 2 개의 루프 ... 이것은 5 개의 쿼리에서 결과를 얻는 데 약 100-200 라인을 얻을 것입니다. 그런 쉬운 일을 하기엔 너무 지나치지 않습니까?

도움이 되었기를 바랍니다. 인사말.

새로운 의견에 따라 내 최신 코드 :

위 :

public partial class Form1 : Form 
{ 
    public static string connString = "Server=10****;Port=3306;Database=e****;Uid=e****;password=****;"; 
    public Form1() 
    { 
     InitializeComponent(); 
     MySqlConnection conn = new MySqlConnection(connString); // Error gone! 
    } 

바디 부분 :

public void QueryTwoFields(string s, List<string> S1, List<string> S2) 
     { 
      try 
      { 
       MySqlCommand cmd = conn.CreateCommand(); // ERROR: conn does not exist in the current context. 
       cmd.CommandType = CommandType.Text; 
       string command = s; 
       cmd.CommandText = command; 
       MySqlDataReader sqlreader = cmd.ExecuteReader(); 
       while (sqlreader.Read()) 
       { 
        S1.Add(sqlreader[0].ToString()); 
        S2.Add(sqlreader[1].ToString()); 
       } 
       sqlreader.Close(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

private void button1_Click(object sender, EventArgs e) 
     { 
      if(listView1.Items.Count > 1) 
      { 
       listView1.Items.Clear(); 
      } 
      var listMember = new List<string>{}; 
      var listOnline = new List<string>{}; 

      using (conn) // ERROR: conn does not exist in the current context. 
      { 
      conn.Open(); 
      ///...1st Query 
      QueryTwoFields("SELECT fullname,online FROM member WHERE active = '1' ORDER BY online DESC",listMember,listOnline); 
      //...2nd query 
      //QueryTwoFields("your new Select Statement", otherList, otherList); 
      } 
     } 
+1

좋은 질문과 답변. – Drew

답변

3

당신은 연결을 종료 할 필요가 없습니다 sqlre를 닫는 것보다 하나의 쿼리를 실행할 때마다 ader는 해당 연결에 할당됩니다. 마지막으로 모든 쿼리가 실행되면 연결이 닫힙니다. repetive로 코드의 순서를 실행하여 쿼리하는 방법을하지 정의

또한 살았어 : 또한 사용의 사용을 고려

public void QueryTwoFields(string s, List<string> S1, List<string> S2)  
///Select into List S1 and List S2 from Database (2 fields) 
       { 
        try 
        {    
          MySqlCommand cmd = conn.CreateCommand(); 
          cmd.CommandType = CommandType.Text; 
          string command = s; 
          cmd.CommandText = command; 
          MySqlDataReader sqlreader = cmd.ExecuteReader(); 
          while (sqlreader.Read()) 
          { 
           S1.Add(sqlreader[0].ToString()); 
           S2.Add(sqlreader[1].ToString());    
          } 
          sqlreader.Close(); 

        } 
        catch (Exception ex) 
        {       
        MessageBox.Show(ex.ToString());    
        }           
       } 
private void button1_Click(object sender, EventArgs e) 
     { 
      if(listView1.Items.Count > 1) 
      { 
       listView1.Items.Clear(); 
      } 
      var listMember = new List<string>{}; 
      var listOnline = new List<string>{}; 

      // SQL PART // 

    using (conn) 
    { 
     conn.Open(); 
     ///...1st Query 
     QueryTwoFields("SELECT fullname,online FROM member WHERE active = '1' ORDER BY online DESC",listmember,listonline) 
     //...2nd query 
     QueryTwoFields("your new Select Statement",myOtherList1,myOtherlist2)  
     .... 
    } 
} 

편집 : 당신이 QueryTwoFields을 정의 어차피 마음에 테이크 메소드 내부의 버튼 핸들러. 외부에 정의해야합니다 (위의 코드 참조). 는 또한 programm에의 시작에 연결 데이터를 정의합니다

namespace MyProject 
    { 
     /// <summary> 
     /// Defiine your connectionstring and connection 
     /// </summary> 
     /// 

     public partial class Form1 : Form 
     { public static string connString = "Server=10*****;Port=3306;Database=e***;Uid=e***;password=********************;";    
      MySqlConnection conn = new MySqlConnection(connString); 

......... 
+0

'첫 번째 쿼리'와 '두 번째 쿼리'의 위치에서 쿼리 (command.CommandText = ...)를 변경해야합니까? 이것에 대해 좀 더 자세히 설명해 주시겠습니까? 'using (conn)'을 사용하면 수동으로 연결을 직접 열 필요가 없다고 생각하십니까? 그것은 'using (conn)'자체에 의해 처리되기 때문에? – C4u

+1

와우 꽤 예쁘다. 지금 당장 귀하의 노력에 감사드립니다. 이것 좀 봐봐. 나에게 이것이 효과가 있으면 나중에 표시해라. :). – C4u

+0

connString (서버 데이터 포함)과 MySqlConnection은 어디에 두어야합니까? 함수 외부와 내부 모두 "conn"를 찾을 수 없다는 오류가 발생합니다. 도움이된다면 새로운 코드를 제공 할 수 있습니다. 지금은 try {}의 첫 번째 위치에 둘 다 넣었습니다. 하지만 'using (conn)'을 사용하면 ''을 (를) 사용하여 '유효하지 않은 토큰'오류가 표시됩니다. – C4u

3

Datatables는 데이터 테이블을 사용

환상적 것은 모두가 읽기 및 쓰기 할 수있는 좋은 방법입니다. 또한 연결 해제 된 상태에서 데이터 그리드 컨트롤에 직접 할당하고, 정렬하고, 선택하고 삭제하는 등 데이터 테이블로 수행 할 수있는 고급 기능을 제공합니다.

아래 샘플에서는 나와 있지 않은 자신의 OpenConnection() 및 CloseConnection() 메서드에 대한 호출로 관리되는 MySqlConnection 연결 속성을 사용한다고 가정합니다.

간단한 데이터 테이블 읽기 데모 :

데이터베이스에 다시 데이터 테이블을 작성하는 경우
public DataTable Select(string query = "") 
    { 
     //Typical sql: "SELECT * FROM motorparameter" 


     DataTable dt = new DataTable(); 

     //Open connection 
     if (this.OpenConnection() == true) 
     { 
      //Create Command 
      MySqlCommand cmd = new MySqlCommand(query, connection); 
      //Create a data reader and Execute the command 
      MySqlDataReader dataReader = cmd.ExecuteReader(); 

      dt.Load(dataReader); 

      //close Data Reader 
      dataReader.Close(); 

      //close Connection 
      this.CloseConnection(); 

      //return data table 
      return dt; 
     } 
     else 
     { 
      return dt; 
     } 
    } 

- 당신이 읽기에 사용 (또는 데이터 테이블을 읽는 데 사용되는 것) SQL을 제공 :

public void Save(DataTable dt, string DataTableSqlSelect) 
    { 
     //Typically "SELECT * FROM motorparameter" 
     string query = DataTableSqlSelect; 

     //Open connection 
     if (this.OpenConnection() == true) 
     { 
      //Create Command 
      MySqlCommand mySqlCmd = new MySqlCommand(query, connection); 


      MySqlDataAdapter adapter = new MySqlDataAdapter(mySqlCmd); 
      MySqlCommandBuilder myCB = new MySqlCommandBuilder(adapter); 
      adapter.UpdateCommand = myCB.GetUpdateCommand(); 

      adapter.Update(dt); 

      //close Connection 
      this.CloseConnection(); 

     } 
     else 
     { 
     } 
    } 

데이터 테이블은 매우 유연합니다. 일단 데이터가 포함되면 테이블에 대해 자신 만의 선택을 실행할 수 있으며 다시 쓰기 전에 어떤 행을 업데이트해야하는지 설정하거나 재설정 할 수 있으며 기본적으로 데이터 테이블은 테이블에서 업데이트하는 행을 추적합니다. db의 모든 테이블에 대한 기본 키 열을 잊지 마십시오.

여러 쿼리의 경우 열 개수 및 데이터 형식이 동일한 경우 데이터가 관련되어 있거나 UNION sql 구문을 사용하는 경우 데이터베이스 테이블이나 같은 테이블 간의 조인을 사용하는 것이 좋습니다. UNION의 어느 부분에서 오는 데이터인지를 구별하기 위해 선택 항목에서 추가 열을 항상 "생성"할 수 있습니다.

다른 소스의 데이터를 조건부로 선택하려면 CASE WHEN SQL 구문을 사용하는 것도 고려하십시오.

+0

마찬가지로 tofo, snippets을 보여 주신 덕분에 – Drew

+0

1 년이 지난 후에 나는이 문제로 다시 돌아오고 있습니다. 마지막으로 나는 여기에서 일어나는 일을 얻기에 충분한 지식을 가지고있다. 지금까지 DataTable의 'Load' 함수에 대해 알았습니다. 꽤 굉장해 보인다. 자동으로 update-statement를 생성하는 방법이 있다는 것이 훨씬 더 끔찍합니다. – C4u

+0

Btw :'DataTable'을 출력을 얻은 후에'SELECT' 문을 저장하는 커스텀'MysqlTable'으로 확장했습니다. 이 방법으로, 나는 단지'MysqlTable'을 update-method에 전달해야하고 마술이 일어납니다. :디. – C4u