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() の後に完全な新しい接続をセットアップする必要がありますか? それとも他に方法はありますか?私は想像することができます:独自の接続、try、catch、および2つのループを備えた5つのクエリ...これは、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); 
            }
        }
4

2 に答える 2

3

その接続に割り当てられた sqlreader を閉じるよりも、1 つのクエリを実行するたびに接続を閉じる必要はありません。最後に、すべてのクエリが実行されたら、接続を閉じます。以下を使用することも検討してください。

コードが繰り返されないように、クエリを実行するためのメソッドも定義します。

    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

データテーブルは素晴らしい

データ テーブルを使用すると、読み取りと書き込みの両方を行うことができます。また、データテーブルを使用して実行できるすべての機能 (データ グリッド コントロールへの直接割り当て、切断中の並べ替え、選択、および削除など) も備えています。

以下のサンプルでは、​​独自の OpenConnection() および CloseConnection() メソッドの呼び出しによって管理される MySqlConnection 接続プロパティを想定していますが、ここには示されていません。

シンプルなデータテーブル読み取りデモ:

    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 のどの部分から来るかを区別するために、select で常に余分な列を「作成」できます。

また、CASE WHEN sql 構文を使用して、さまざまなソースから条件付きでデータを選択することも検討してください。

于 2015-05-28T05:41:03.427 に答える