2014-09-04 76 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