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

Posted

技术标签:

【中文标题】在 C# 中从数据库加载组合框【英文标题】:Loading combobox from database in C# 【发布时间】:2012-07-31 00:59:40 【问题描述】:

我正在创建一个应用程序,我可以在其中添加客户的名字、姓氏、电子邮件、日期、服务类型(电脑维修)、技术人员电脑品牌、电脑类型、操作系统类型以及问题电脑。我可以使用 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();
  

【问题讨论】:

您可能希望查看连接、数据适配器、数据集等的使用语句。另外,请阅读参数化 SQL,否则您将面临 SQL 注入攻击 你的控件绑定到ds了吗?我相信在数据更改后,您需要手动更新控件或重新绑定它们以获得显示的结果 【参考方案1】:

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

此示例执行以下操作:

    将客户 ID(或您的姓氏)加载到组合框。 处理组合框的更改事件并将其作为参数传递给 方法将使用它来加载详细信息。 使用传递的参数加载客户详细信息。

几条准则:

    将一次性对象包含在“使用”语句中,以便 妥善处置。 不要使用字符串连接来创建 SQL 语句。采用 而是使用 SQL 参数,这样您就可以避免 SQL 注入并生成 你的代码更清晰。

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

我不完全确定这是否是您要查找的内容,但大多数准则仍然适用。

希望这会有所帮助!

【讨论】:

太棒了!谢谢!我会全力以赴!非常感谢! 我不确定这是否是您要寻找的东西,但是,这仍然适用于您将要做的事情。【参考方案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。

【讨论】:

【参考方案3】:

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

尝试以下方法:

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

【讨论】:

【参考方案4】:

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

“userRead”是SQLData阅读器

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

【讨论】:

【参考方案5】:

将您的数据集绑定到 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;

【讨论】:

【参考方案6】:
//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());
                


【讨论】:

我知道这不是最有效的代码,但它很容易阅读。此代码在您加载表单时将显示值(不是 ID 值)放入组合框。并且应该准备数据以通过它的ID发送到数据库。确保您的数据库被组织成接受 id 到字段中。

以上是关于在 C# 中从数据库加载组合框的主要内容,如果未能解决你的问题,请参考以下文章

如何在 php 中从表单提交的组合框中获取选定的值

将特定行加载为组合框中的默认项

C#组合框,将文本值分配给焦点丢失事件的变量?

使用大量项目填充组合框

具有相同数据源的多个组合框 (C#)

根据组合框选择 C# 更改组合框值