C#Mysql多个查询



我正在尝试构建一个小的状态工具。我需要得到多个查询的结果(大约4-5个)。一般的连接设置和"如何读取数据"已经完成,但我不知道另一个查询是如何执行的。

我在搜索它时发现的所有内容都是针对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个查询有自己的连接,try,catch和2个循环。。。这将得到大约100-200行,仅用于从5个查询中获得结果。对于这么简单的事情来说,这不是有点太过分了吗?

希望得到一些帮助。问候。

根据新的评论,我的最新代码:

顶部:

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); 
            }
        }

您不必每次执行一个查询时都关闭连接,只需关闭分配给该连接的sqlreader即可。最后,当所有查询都已执行完毕时,您将关闭连接。还可以考虑使用:

您还可以定义一种执行查询的方法,以使代码不重复:

    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方法。您必须在外部定义它(请参阅上面的代码)。此外,在程序开始时定义您的连接数据:

    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);
.........

数据表非常棒

使用数据表是一种很好的读写方法。它还提供了对数据表所能做的所有事情的奢侈功能,比如将其直接签名到数据网格控件,在断开连接时进行排序、选择和删除。

下面的示例假设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(或本应用于读取数据表的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语法。您可以在select中"创建"额外的列,以区别UNION的哪个部分的数据。

还可以考虑使用CASE WHEN sql语法来有条件地选择来自不同来源的数据。

最新更新