基于ComBox填充文本框,通过文本框插入数据库
本文关键字:文本 插入 数据库 ComBox 基于 填充 | 更新日期: 2023-09-27 18:11:06
我在基于组合框填充文本框时遇到了麻烦,插入代码也不起作用。
应该发生的是,通过从ComboBox中选择客户,详细信息显示在文本框中,我还可以通过文本框将客户添加到ComboBox,也有一个DataGridView显示来自另一个表的相关信息基于我的ComboBox选择,但这不是现在的问题。
注意:
我最近切换到Visual Studio 2012,我想这不是问题。
组合框例外:
类型为"System.Data.SqlServerCe"的异常。在System.Data.SqlServerCe.dll中发生SqlCeException,但未在用户代码中处理。
保存按钮异常:
输入字符串格式不正确。
关于保存按钮,CustomerID是一个自动增量数字,所以我应该能够离开它的文本框空白,但它不工作,当我这样做。
表结构:Customers
CustomerID [int] [PK] [AutoNumber]
Name [nvarchar]
Phone1 [int]
Phone2 [int]
Address [nvarchar]
Notes [ntext]
代码:private void FillCombo()
{
string code = "SELECT CustomerID, Name FROM Customers";
SqlCeDataAdapter da = new SqlCeDataAdapter(code, clsMain.con);
DataSet ds = new DataSet();
da.Fill(ds);
cBox1.DataSource = ds.Tables[0];
cBox1.DisplayMember = "Name";
cBox1.ValueMember = "CustomerID";
}
private void frmMain_Load(object sender, EventArgs e)
{
clsMain.con.Open();
FillCombo();
}
private void cBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string code = "SELECT * FROM Customers WHERE CustomerID='" + cBox1.Text + "'";
SqlCeDataAdapter da = new SqlCeDataAdapter(code, clsMain.con);
SqlCeCommandBuilder cmd = new SqlCeCommandBuilder(da);
DataSet ds = new DataSet();
da.Fill(ds);
if (cBox1.SelectedIndex > 0)
{
txt1.Text = ds.Tables[0].Rows[0]["CustomerID"].ToString();
txt2.Text = ds.Tables[0].Rows[0]["Name"].ToString();
txt3.Text = ds.Tables[0].Rows[0]["Phone1"].ToString();
txt4.Text = ds.Tables[0].Rows[0]["Phone2"].ToString();
txt5.Text = ds.Tables[0].Rows[0]["Address"].ToString();
txt6.Text = ds.Tables[0].Rows[0]["Notes"].ToString();
}
}
private void stripSave_Click(object sender, EventArgs e)
{
string code = "INSERT INTO Customers VALUES (@CustomerID, @Name, @Phone1, @Phone2, @Address, @Notes)";
SqlCeCommand cmd = new SqlCeCommand(code, clsMain.con);
cmd.Parameters.AddWithValue("@CustomerID", (txt1.Text); //Tried Parse and Convert.
cmd.Parameters.AddWithValue("@Name", txt2.Text);
cmd.Parameters.AddWithValue("@Phone1", txt3.Text);
cmd.Parameters.AddWithValue("@Phone2", txt4.Text);
cmd.Parameters.AddWithValue("@Address", txt5.Text);
cmd.Parameters.AddWithValue("@Notes", txt6.Text);
cmd.ExecuteNonQuery();
MessageBox.Show("Data stored.");
}
很抱歉,如果这是一个很长的代码,但我认为这样会更容易发现问题
看起来CustomerID
是整数值,所以你需要更改
cmd.Parameters.AddWithValue("@CustomerID", txt1.Text);
cmd.Parameters.AddWithValue("@CustomerID", Int32.Parse(txt1.Text));
按PhoenixReborn
如果CustomerID是自动递增的,为什么要把它保存到数据库中?有点违背目的。
那么你需要编辑你的查询到
string code = "INSERT INTO Customers(name, phone1, phone2, address, notes) VALUES (@Name, @Phone1, @Phone2, @Address, @Notes)";
SqlCeCommand cmd = new SqlCeCommand(code, clsMain.con);
cmd.Parameters.AddWithValue("@Name", txt2.Text);
cmd.Parameters.AddWithValue("@Phone1", txt3.Text);
cmd.Parameters.AddWithValue("@Phone2", txt4.Text);
cmd.Parameters.AddWithValue("@Address", txt5.Text);
cmd.Parameters.AddWithValue("@Notes", txt6.Text);
cmd.ExecuteNonQuery();
MessageBox.Show("Data stored.");
试试这个:
private void stripSave_Click(object sender, EventArgs e)
{
int id;
string code;
SqlCeCommand cmd;
/*
If textbox is empty or input is not integer, then take the next id from table.
Otherwise, id is set to input value.
*/
if (txt1.Text == String.Empty || !int.TryParse(txt1.Text, out id))
{
/*
Selects max id + 1
If the table is empty, the result will be null
and coalesce will return 0 for the first id number
*/
code = "SELECT COALESCE((SELECT MAX(CustomerID) + 1 FROM Customers), 0);";
cmd = new SqlCeCommand(code, clsMain.con);
id = (int)cmd.ExecuteScalar();
}
code = "INSERT INTO Customers VALUES (@CustomerID, @Name, @Phone1, @Phone2, @Address, @Notes);";
cmd = new SqlCeCommand(code, clsMain.con);
cmd.Parameters.AddWithValue("@CustomerID", id);
cmd.Parameters.AddWithValue("@Name", txt2.Text);
cmd.Parameters.AddWithValue("@Phone1", txt3.Text);
cmd.Parameters.AddWithValue("@Phone2", txt4.Text);
cmd.Parameters.AddWithValue("@Address", txt5.Text);
cmd.Parameters.AddWithValue("@Notes", txt6.Text);
cmd.ExecuteNonQuery();
MessageBox.Show("Data stored.");
}
顺便说一下,关于代码的一个重要注意事项:每次执行查询时最好连接到数据库,然后关闭它。我的意思是,与其在整个执行时间保持连接打开,不如使用如下命令:
try
{
clsMain.con.Open();
cmd.ExecuteNonQuery();
clsMain.con.Close();
}
catch (Exception ex)
{
if (clsMain.con.State != ConnectionState.Closed)
clsMain.con.Close();
MessageBox.Show(ex.Message);
}