【问题标题】:C# Mysql multiple queriesC# Mysql 多重查询
【发布时间】:2014-10-28 20:35:26
【问题描述】:

我正在尝试构建一个小的状态工具。我需要获得多个查询的结果(大约 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-part 中的列表中,以便稍后处理列表中的数据。

我真的必须在 conn.Close() 之后建立一个完整的新连接吗?或者还有其他方法吗?我可以想象:5 个带有自己连接的查询、try、catch 和 2 个循环......这将得到大约 100-200 行,只是为了从 5 个查询中获取结果。这么简单的事情,是不是有点过分了?

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

根据新的 cmets 我的最新代码:

顶部:

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

【问题讨论】:

  • 很好的问题和答案。

标签: c# mysql multiple-results


【解决方案1】:

您不必每次执行一个查询时都关闭连接,而不是关闭分配给该连接的 sqlreader。最后,当您的所有查询都已执行时,您关闭连接。还考虑使用 using:

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

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

.........

【讨论】:

  • 我只需要在“第一个查询”和“第二个查询”的位置更改查询(command.CommandText = ...)吗?您能否为此提供更多细节?使用'using(conn)'时,我想不需要手动打开连接吗?因为它是由 'using(conn)' 本身处理的?
  • 哇,这看起来很漂亮。感谢您现在的努力。给我一些时间检查一下。如果这对我有用,我稍后会标记它:)。
  • 我必须将我的 connString(包括服务器数据)和 MySqlConnection 放在哪里?函数外部和内部都给我找不到“conn”的错误。如果这有帮助,我可以提供我的新代码。现在我将它们都放在 try{} 的第一个位置。但随后 'using(conn)' 显示错误 'invalid token "using"'。
  • 是的,错字..我删除了额外的括号也不要声明方法静态..查看我的编辑
  • 最后一次编辑我相信...在开始时将其设置为静态
【解决方案2】:

数据表很棒

使用数据表是一种很好的读写方式。它还附带了您可以对数据表执行的所有操作 - 例如将其直接分配给数据网格控件、排序、选择和在断开连接时删除。

下面的示例假定 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 语法有条件地选择来自不同来源的数据。

【讨论】:

  • tofo 同样在这里,感谢您展示 sn-ps
  • 一年多之后,我又回来了。最后我有足够的知识来了解这里发生的事情。到目前为止,我还没有了解 DataTable 上的 Load 函数。看起来非常棒。更棒的是有一种方法可以自动生成更新语句。
  • 顺便说一句:我已将DataTable 扩展为自定义MysqlTable,即在获得输出后保存SELECT 语句。这样,我只需将我的MysqlTable 传递给更新方法,奇迹就会发生。 :D.
猜你喜欢
  • 2014-03-14
  • 2023-03-26
  • 2014-10-22
  • 1970-01-01
  • 2016-03-05
  • 2011-04-28
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多