2

我试图建立一个小的状态工具。我需要获得多个查询的结果(大约 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 个查询中获取结果。这么简单的事情是不是有点过分了?

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

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

最佳:

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

2 回答 2

3

您不必在每次执行一个查询时都关闭连接,而不是关闭分配给该连接的 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);

.........
于 2014-09-04T07:37:30.780 回答
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 语法有条件地选择来自不同来源的数据。

于 2015-05-28T05:41:03.427 回答