在C#中从数据库加载组合框

时间:2012-07-31 00:59:41

标签: c# mysql combobox sqldataadapter

我正在创建一个应用程序,我可以在其中添加客户的名字,姓氏,电子邮件,日期,服务类型(电脑维修),技术人员PC品牌,电脑类型,操作系统类型以及问题与电脑。我可以使用phpMyAdmin将数据插入MySQL数据库。

但是,我坚持这一部分。我正在尝试查看刚刚创建的服务订单。我想按客户的姓氏加载组合框,一旦我点击客户的名字,它就会填充上面提到的所有字段以及它插入数据库的服务号。我在加载组合框和texfields时遇到问题。

任何想法都表示赞赏!如果组合框是一个坏主意并且有更好的方法,请告诉我!我试过这段代码,但是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();
  }
}

6 个答案:

答案 0 :(得分:3)

我不建议使用“姓氏”作为参数来加载您的详细信息,因为该字段很可能不是唯一的。除非你的程序就是这种情况。

此示例执行以下操作:

  1. 将客户ID(或您的案例中的姓氏)加载到组合框中。
  2. 处理组合框的更改事件并将其作为参数传递给a 将使用它来加载细节的方法。
  3. 使用传递的参数加载客户详细信息。
  4. 一些指导原则:

    1. 将一次性对象包含在'using'语句中,这样就可以了 妥善处理。
    2. 不要使用字符串连接来创建SQL语句。使用 相反,SQL参数,你将避免SQL注入和make 你的代码更清晰。
    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);
      }
      
    4. 我不完全确定这是否符合您的要求,但大多数指南仍适用。

      希望这有帮助!

答案 1 :(得分: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());
    }
}

取自my own question

答案 2 :(得分:1)

SqlDataAdapter用于与SQL Server而不是MySQL通信。

尝试以下方法:

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

答案 3 :(得分:0)

我们也可以使用while循环。在SQLDatareader之后完成数据库连接时,我们可以使用while循环。

“userRead”是SQLData reader

  while (userRead.Read())
   {
        cboxReportNo.Items.Add(userRead[1].ToString());
   }

答案 4 :(得分:0)

ComboBox 数据源

中绑定数据集
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;

答案 5 :(得分:-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());
                }
}
}