在 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# 中从数据库加载组合框的主要内容,如果未能解决你的问题,请参考以下文章