1

私は、顧客の名、姓、電子メール、日付、サービスの種類 (PC 修理)、技術者の PC ブランド、PC の種類、OS の種類、およびコンピューターの問題を追加できるアプリケーションを作成しています。phpMyAdmin を使用して MySQL データベースにデータを挿入できます。

しかし、私はこの部分にこだわっています。作成したばかりのサービス注文を表示しようとしています。顧客の姓でコンボボックスをロードしたいと思います。顧客の名前をクリックすると、上記のすべてのフィールドとデータベースに挿入されたサービス番号が入力されます。コンボボックスとテックスフィールドの読み込みに問題があります。

どんなアイデアでも大歓迎です!コンボボックスが悪いアイデアで、より良い方法がある場合は、私に知らせてください! このコードを試しましたが、SQLDataAdapter が機能しません。どういうわけか、私も関連付けることができる例を見つけることができません。

private void cbViewServices_SelectedIndexChanged(object sender, EventArgs e)
{
  if (cbViewServices.SelectedIndex >- 1)
  {
    string lastName = cbViewServices.SelectedValue.ToString();                
    MySqlConnection conn = new MySqlConnection("server=localhost;uid=******;password=**********;database=dboserviceinfo;");
    conn.Open();

    SqlDataAdapter da = new SqlDataAdapter("select distinct LastName from tserviceinfo where LastName='" + lastName + "'", conn);

    DataSet ds = new DataSet();
    da.Fill(ds); conn.Close();
  }
}
4

6 に答える 6

4

「Lastname」をパラメータとして使用して詳細をロードすることはお勧めしません。そのフィールドは一意ではない可能性が高いためです。それがあなたのプログラムに当てはまらない限り。

このサンプルは次のことを行います。

  1. 顧客ID(またはあなたの場合は姓)をコンボボックスにロードします。
  2. コンボボックスの変更イベントを処理し、それを使用して詳細をロードするメソッドにパラメーターとして渡します。
  3. 渡されたパラメータを使用して顧客の詳細をロードします。

いくつかのガイドライン:

  1. 適切に廃棄されるように、使い捨てオブジェクトを「using」ステートメントで囲みます。
  2. SQLステートメントの作成に文字列連結を使用しないでください。代わりにSQLパラメータを使用してください。そうすれば、SQLインジェクションを回避し、コードをより明確にすることができます。
  3. ベストプラクティスについては、MySQL.NETコネクタプロバイダーのドキュメントを参照してください。

    //Load customer ID to a combobox
    private void LoadCustomersId()
    {
        var connectionString = "connection string goes here";
        using (var connection = new MySqlConnection(connectionString))
        {
            connection.Open();
            var query = "SELECT Id FROM Customers";
            using (var command = new MySqlCommand(query, connection))
            {
                using (var reader = command.ExecuteReader())
                {
                    //Iterate through the rows and add it to the combobox's items
                    while (reader.Read())
                    {
                        CustomerIdComboBox.Items.Add(reader.GetString("Id"));    
                    }
                }    
            }
        }
    }
    
    //Load customer details using the ID
    private void LoadCustomerDetailsById(int id)
    {
        var connectionString = "connection string goes here";
        using (var connection = new MySqlConnection(connectionString))
        {
            connection.Open();
            var query = "SELECT Id, Firstname, Lastname FROM Customer WHERE Id = @customerId";
            using (var command = new MySqlCommand(query, connection))
            {
                //Always use SQL parameters to avoid SQL injection and it automatically escapes characters
                command.Parameters.AddWithValue("@customerId", id);
                using (var reader = command.ExecuteReader())
                {
                    //No customer found by supplied ID
                    if (!reader.HasRows)
                        return;
    
                    CustomerIdTextBox.Text = reader.GetInt32("Id").ToString();
                    FirstnameTextBox.Text = reader.GetString("Firstname");
                    LastnameTextBox.Text = reader.GetString("Lastname");
                }
            }
        }
    }
    
    //Pass the selected ID in the combobox to the customer details loader method 
    private void CustomerIdComboBox_SelectedIndexChanged(object s, EventArgs e)
    {
        var customerId = Convert.ToInt32(CustomerIdComboBox.Text);
        LoadCustomerDetailsById(customerId);
    }
    

これがあなたが探しているものであるかどうかは完全にはわかりませんが、ほとんどのガイドラインは依然として適用されます。

お役に立てれば!

于 2012-07-31T02:50:23.653 に答える
2

次のようにして、データをコンボ ボックスにバインドします。

public void ListCat()
{
    DataTable linkcat = new DataTable("linkcat");
    using (SqlConnection sqlConn = new SqlConnection(@"Connection stuff;"))
    {
        using (SqlDataAdapter da = new SqlDataAdapter("SELECT LastName FROM list WHERE LastName <> 'NULL'", sqlConn))
        {
            da.Fill(linkcat);
        }
    }
    foreach (DataRow da in linkcat.Rows)
    {
        comboBox1.Items.Add(da[0].ToString());
    }
}

私自身の質問から引用。

于 2012-07-31T01:03:51.333 に答える
1

SqlDataAdapter は、MySQL ではなく SQL Server と通信するために使用されます。

次のことを試してください。

MySqlDataAdapter da = new MySqlDataAdapter("select distinct LastName from tserviceinfo where LastName='" + lastName + "'", conn);
于 2012-07-31T01:07:31.140 に答える
0

データセットをComboBox DataSourceにバインドします

this.comboBox1.DataSource = ds;
this.comboBox1.DisplayMember = "LastName";
this.comboBox1.ValueMember = "Id";
this.comboBox1.SelectedIndex = -1;
this.comboBox1.AutoCompleteMode = AutoCompleteMode.Append;
this.comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;
于 2017-08-04T07:24:28.087 に答える
-1
//USING
        using System;
        using System.Drawing;
        using System.Windows.Forms;
        using System.Data.SqlClient;
        using System.Data;

namespace YourNamespace
{
//Initialization
        string connetionString = null;
        SqlConnection cnn;
        SqlCommand cmdDataBase;
        SqlDataReader reader;
        DataTable dt;

public frmName()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
            FillComboNameOfCombo();
        }

void FillcmbNameOfCombo()
{
    string sqlQuery = "SELECT * FROM DATABASENAME.[dbo].[TABLENAME];";
            connetionString = "Data Source=YourPathToServer;Initial Catalog=DATABASE_NAME;User ID=id;Password=pass";
                    cnn = new SqlConnection(connetionString); 
                    cmdDataBase = new SqlCommand(sqlQuery, cnn);
            try { 
                    cnn.Open(); 

                    reader = cmdDataBase.ExecuteReader();
                    dt = new DataTable();

                    dt.Columns.Add("ID", typeof(string));
                    dt.Columns.Add("COLUMN_NAME", typeof(string));
                    dt.Load(reader);
                    cnn.Close();

                    cmbGender.DataSource = dt;
                    cmbGender.ValueMember = "ID";
                    cmbGender.DisplayMember = "COLUMN_NAME";

                    dt = null;
                    cnn = null;
                    cmdDataBase = null;
                    connetionString = null;
                    reader = null;
                }
            catch (Exception ex) { 
                    MessageBox.Show("Can not open connection ! " + ex.ToString());
                }
}
}
于 2016-09-29T16:54:02.857 に答える