为什么绑定数据不适用于 C# 中的 union sql 查询?
Why binding data does not work with union sql query in C#?
我有一个 listbox
和一个 union
查询 datasource
:
public partial class FrmCodes : Form
{
SqlConnection Cn = new SqlConnection(@"Server = AMR-PC\SQLEXPRESS ; Database=PlanningDB ; Integrated Security = True");
SqlDataAdapter da,da2;
DataTable dt = new DataTable();
DataTable dt2 = new DataTable();
CurrencyManager Cm;
SqlCommandBuilder Cmdb;
string prm,SlctType;
public FrmCodes()
{
InitializeComponent();
da = new SqlDataAdapter("SELECT Code,Item,Type FROM Items UNION SELECT ProductCode,Product,Family FROM Products", Cn);
da.Fill(dt);
DataView dv = new DataView(dt);
ListItems.DataSource = dv;
ListItems.DisplayMember = "Item";
}
我正在尝试根据 listbox
选择将数据绑定到此表单中的四个文本框,首先我直接尝试了联合查询,但不断收到错误消息“第 x 列不存在 .... “所以我使用了原来的两个查询,像这样分开:
private void ListItems_Click(object sender, EventArgs e)
{
var Slctd = (DataRowView)ListItems.SelectedItem;
if (Slctd != null)
{
prm = Slctd["Code"].ToString();
SlctType = Slctd["Type"].ToString();
// Try to solve two bindings to the same property error
txtcode.DataBindings.Clear();
txtItem.DataBindings.Clear();
txtMaterialType.DataBindings.Clear();
txtFamily.DataBindings.Clear();
if (SlctType == "Material" || SlctType == "Master" || SlctType == "Packing" || SlctType == "Mix")
{
this.txtMaterialType.Visible = true;
this.lblMaterialType.Visible = true;
this.txtFamily.Visible = false;
this.lblFamily.Visible = false;
//this.PgBom.Hide();
try
{
da2 = new SqlDataAdapter("SELECT Code,Item,Type FROM Items WHERE Code LIKE '%prm%' ", Cn);
da2.Fill(dt2);
txtcode.DataBindings.Add("Text", dt2, "Code");
txtItem.DataBindings.Add("Text", dt2, "Item");
txtMaterialType.DataBindings.Add("Text", dt2, "Type");
Cm = (CurrencyManager)this.BindingContext[dt2];
}
catch (SqlException Err)
{
MessageBox.Show("This Error Occured :" + Err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
// MessageBox.Show("You Chosed : " + prm + " It Is Product ", "Product");
this.txtFamily.Visible = true;
this.lblFamily.Visible = true;
this.txtMaterialType.Visible = false;
this.lblMaterialType.Visible = false;
try
{
da2 = new SqlDataAdapter("SELECT ProductCode,Product,Family FROM Products WHERE ProductCode LIKE '%prm%'", Cn);
da2.Fill(dt2);
txtcode.DataBindings.Add("Text", dt2, "ProductCode");
txtItem.DataBindings.Add("Text", dt2, "Product");
txtFamily.DataBindings.Add("Text", dt2, "Family");
Cm = (CurrencyManager)this.BindingContext[dt2];
}
catch (SqlException Err)
{
MessageBox.Show("This Error Occured :" + Err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
else
{
prm = "";
}
}
但是文本框没有任何反应,没有数据出现在文本框中。
如果出现数据,我需要使用 Currency Manager
进行编辑、添加、删除:
private void CmdEdit_Click(object sender, EventArgs e)
{
try
{
Cm.EndCurrentEdit();
Cmdb = new SqlCommandBuilder(da2);
da.Update(dt2);
Cm.Refresh();
MessageBox.Show("Edited Successfuly", "Done :)", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (SqlException Err)
{
MessageBox.Show("This Error Occured :" + Err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
抱歉这么久 post ,提前致谢。
编辑 #1:当我尝试将 sql 查询的条件设置为固定值时,它工作正常并且数据编辑也有效。
da2 = new SqlDataAdapter("SELECT ProductCode,Product,Family FROM Products WHERE ProductCode LIKE '10001'", Cn);
但是,如果条件是一个变量值或 Textbox.Text
文本框中什么也不会显示。
编辑 #2:我将引用语法从 LIKE '%prm%'
更改为 LIKE @prm
并添加了此代码:
da2.SelectCommand.Parameters.AddWithValue("@prm", "%" + Slctd["Code"].ToString() + "%");
而且效果很好。
经过一番研究我明白了,问题是
da2 = new SqlDataAdapter("SELECT Code,Item,Type FROM Items WHERE Code LIKE '%prm%' ", Cn);
我改成:
da2 = new SqlDataAdapter("SELECT Code,Item,Type FROM Items WHERE Code LIKE @prm ", Cn);
da2.SelectCommand.Parameters.AddWithValue("@prm", "%" + Slctd["Code"].ToString() + "%");
现在很好,谢谢大家。
我有一个 listbox
和一个 union
查询 datasource
:
public partial class FrmCodes : Form
{
SqlConnection Cn = new SqlConnection(@"Server = AMR-PC\SQLEXPRESS ; Database=PlanningDB ; Integrated Security = True");
SqlDataAdapter da,da2;
DataTable dt = new DataTable();
DataTable dt2 = new DataTable();
CurrencyManager Cm;
SqlCommandBuilder Cmdb;
string prm,SlctType;
public FrmCodes()
{
InitializeComponent();
da = new SqlDataAdapter("SELECT Code,Item,Type FROM Items UNION SELECT ProductCode,Product,Family FROM Products", Cn);
da.Fill(dt);
DataView dv = new DataView(dt);
ListItems.DataSource = dv;
ListItems.DisplayMember = "Item";
}
我正在尝试根据 listbox
选择将数据绑定到此表单中的四个文本框,首先我直接尝试了联合查询,但不断收到错误消息“第 x 列不存在 .... “所以我使用了原来的两个查询,像这样分开:
private void ListItems_Click(object sender, EventArgs e)
{
var Slctd = (DataRowView)ListItems.SelectedItem;
if (Slctd != null)
{
prm = Slctd["Code"].ToString();
SlctType = Slctd["Type"].ToString();
// Try to solve two bindings to the same property error
txtcode.DataBindings.Clear();
txtItem.DataBindings.Clear();
txtMaterialType.DataBindings.Clear();
txtFamily.DataBindings.Clear();
if (SlctType == "Material" || SlctType == "Master" || SlctType == "Packing" || SlctType == "Mix")
{
this.txtMaterialType.Visible = true;
this.lblMaterialType.Visible = true;
this.txtFamily.Visible = false;
this.lblFamily.Visible = false;
//this.PgBom.Hide();
try
{
da2 = new SqlDataAdapter("SELECT Code,Item,Type FROM Items WHERE Code LIKE '%prm%' ", Cn);
da2.Fill(dt2);
txtcode.DataBindings.Add("Text", dt2, "Code");
txtItem.DataBindings.Add("Text", dt2, "Item");
txtMaterialType.DataBindings.Add("Text", dt2, "Type");
Cm = (CurrencyManager)this.BindingContext[dt2];
}
catch (SqlException Err)
{
MessageBox.Show("This Error Occured :" + Err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
// MessageBox.Show("You Chosed : " + prm + " It Is Product ", "Product");
this.txtFamily.Visible = true;
this.lblFamily.Visible = true;
this.txtMaterialType.Visible = false;
this.lblMaterialType.Visible = false;
try
{
da2 = new SqlDataAdapter("SELECT ProductCode,Product,Family FROM Products WHERE ProductCode LIKE '%prm%'", Cn);
da2.Fill(dt2);
txtcode.DataBindings.Add("Text", dt2, "ProductCode");
txtItem.DataBindings.Add("Text", dt2, "Product");
txtFamily.DataBindings.Add("Text", dt2, "Family");
Cm = (CurrencyManager)this.BindingContext[dt2];
}
catch (SqlException Err)
{
MessageBox.Show("This Error Occured :" + Err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
else
{
prm = "";
}
}
但是文本框没有任何反应,没有数据出现在文本框中。
如果出现数据,我需要使用 Currency Manager
进行编辑、添加、删除:
private void CmdEdit_Click(object sender, EventArgs e)
{
try
{
Cm.EndCurrentEdit();
Cmdb = new SqlCommandBuilder(da2);
da.Update(dt2);
Cm.Refresh();
MessageBox.Show("Edited Successfuly", "Done :)", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (SqlException Err)
{
MessageBox.Show("This Error Occured :" + Err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
抱歉这么久 post ,提前致谢。
编辑 #1:当我尝试将 sql 查询的条件设置为固定值时,它工作正常并且数据编辑也有效。
da2 = new SqlDataAdapter("SELECT ProductCode,Product,Family FROM Products WHERE ProductCode LIKE '10001'", Cn);
但是,如果条件是一个变量值或 Textbox.Text
文本框中什么也不会显示。
编辑 #2:我将引用语法从 LIKE '%prm%'
更改为 LIKE @prm
并添加了此代码:
da2.SelectCommand.Parameters.AddWithValue("@prm", "%" + Slctd["Code"].ToString() + "%");
而且效果很好。
经过一番研究我明白了,问题是
da2 = new SqlDataAdapter("SELECT Code,Item,Type FROM Items WHERE Code LIKE '%prm%' ", Cn);
我改成:
da2 = new SqlDataAdapter("SELECT Code,Item,Type FROM Items WHERE Code LIKE @prm ", Cn);
da2.SelectCommand.Parameters.AddWithValue("@prm", "%" + Slctd["Code"].ToString() + "%");
现在很好,谢谢大家。