2014-09-04 75 views
2

我試圖建立一個小的狀態工具。我需要得到多個查詢的結果(大約4-5)。一般的連接設置和'how-to-read-data'已經完成了,但我無法弄清楚另一個查詢是如何執行的。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-part中的列表中,以便稍後處理列表中的數據。

我真的必須在conn.Close()之後建立一個完整的新連接嗎?或者還有其他方法嗎?我可以想象:使用自己的連接進行5個查詢,嘗試,捕獲和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 2016-01-05 17:21:18

回答

3

您不必關閉連接每次你執行一個查詢比關閉sqlre更大ader分配給該連接。最後,當您執行了所有查詢時,請關閉連接。也考慮使用使用:

也CAL爲了定義一個方法來執行你的查詢您的代碼不被宋衍濤:

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

我只需要在'1st query'和'2nd query'的位置更改查詢(command.CommandText = ...)嗎?你能提供一些更詳細的信息嗎?當使用'使用(conn)'我想沒有必要手動打開連接嗎?因爲它是由「使用(conn)」本身處理的? – C4u 2014-09-04 07:56:54

+1

哇,這看起來很漂亮。感謝您現在的努力。給我一些時間來檢查這一點。如果這對我有效:)以後再標記它:)。 – C4u 2014-09-04 08:09:12

+0

我在哪裏必須把我的connString(包括服務器數據)和MySqlConnection?這兩個,外部和內部的功能給我錯誤的「康恩」無法找到。如果這有幫助,我可以提供我的新代碼。現在我把它們放在try {}的第一個位置。但是,'使用(conn)'使用「'顯示錯誤」無效標記「。 – C4u 2014-09-04 08:53:07

3

數據表是太棒了

使用數據表是一個很好的方式做讀取和寫入。而且它具有您可以使用數據表完成的任務 - 比如直接將其分配給數據網格控件,排序,選擇和刪除,同時斷開連接。

下面的示例假設通過呼叫管理的連接如的MySqlConnection屬性爲自己的OpenConnection的(),而不是顯示CloseConnection()方法。

簡單的數據表讀取演示:

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 
     { 
     } 
    } 

數據表非常靈活的整潔的事情。一旦它包含數據,並且在寫回之前,您可以針對表運行自己的選擇,您可以設置或重置需要更新的行,默認情況下,數據表會跟蹤您在表中更新的行。不要忘記數據庫中所有表的主鍵列。

對於多個查詢,如果列數和數據類型相同,則考慮是否可以使用數據庫表或同一個表之間的聯接,如果數據相關或使用UNION sql語法。您可以在選擇中「創建」額外的列,以區分哪些數據來自UNION的哪個部分。

還可以考慮使用CASE WHEN sql語法來有條件地選擇不同來源的數據。

+0

同樣也在這裏爲你tofo,感謝您顯示片段 – Drew 2016-01-05 17:24:24

+0

超過一年後,我回來了。最後,我有足夠的知識去了解這裏發生的事情。目前爲止,我對DataTable上的'Load'函數了如指掌。看起來很棒。更令人敬畏的是,有一種方法可以自動生成更新語句。 – C4u 2016-07-08 10:31:24

+0

Btw:我已經將'DataTable'擴展到一個自定義的'MysqlTable',它在獲得輸出後保存'SELECT'語句。這樣,我只需要將我的'MysqlTable'傳遞給更新方法併發生魔法。 :d。 – C4u 2016-07-08 10:32:46