我试图通过Windows窗体应用程序使用ID(整数)或名称(字符串)在oledb数据库中进行搜索。用户使用组合框选择搜索类型,因为可能的搜索类型不同我使用开关创建两个不同的查询:
string Combo = this.comboBox1.SelectedItem.ToString();
string text = this.textBox1.Text;
connection.Open();
OleDbCommand command = null;
switch (Combo)
{
case "Nombre":
command = new OleDbCommand("SELECT Id, Nombre FROM ARTICULOS WHERE ? LIKE ? OR ? LIKE ?", connection);
command.Parameters.AddWithValue("?", Combo);
command.Parameters.AddWithValue("?", "%" + LowercaseFirst(text) + "%");
command.Parameters.AddWithValue("?", Combo);
command.Parameters.AddWithValue("?", "%"+UppercaseFirst(text)+"%");
break;
case "Id":
command = new OleDbCommand("SELECT Id, Nombre FROM ARTICULOS WHERE ? LIKE ?", connection);
command.Parameters.AddWithValue("?", Combo);
command.Parameters.AddWithValue("?", Convert.ToInt32(text));
//command.Parameters.AddWithValue("?", "%" + Convert.ToInt32(text) + "%");
break;
}
try
{
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
string list = "";
list += reader.GetValue(0).ToString() + "\t";
list += reader.GetValue(1).ToString();
this.listBox1.Items.Add(list);
}
}
catch (Exception ex)
{
DialogResult result = MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK);
this.Close();
}
connection.Close();
组合框默认以Nombre
(西班牙语名称)启动,它显示数据库中的所有项目(如我所愿)。
当用户在文本框中插入文本时,第一个问题就开始了。例如,当我在文本框中插入“p”时,它必须显示数据库中包含“p”(大写和小写)的所有内容,而不是。
第二个问题是当用户在组合框Id
中选择时,会导致错误Input String has not a correct format
(使用注释和非注释的指令)。
知道如何更改代码以读取我想在数据库中搜索的项目吗?
修改
感谢您的分配。看到答案我会尝试回答它们(太多的信息把它作为评论)。首先,我按照Jon的说法更改了代码,现在它在选择Nombre
时正常工作:
this.listBox1.Items.Clear();
string Combo = this.comboBox1.SelectedItem.ToString();
string text = this.textBox1.Text;
connection.Open();
OleDbCommand command = null;
switch (Combo)
{
case "Nombre":
command = new OleDbCommand("SELECT Id, Nombre FROM ARTICULOS WHERE Nombre LIKE ? OR Nombre LIKE ?", connection);
command.Parameters.AddWithValue("?", "%" + LowercaseFirst(text) + "%");
command.Parameters.AddWithValue("?", "%" + UppercaseFirst(text) + "%");
break;
case "Id":
command = new OleDbCommand("SELECT Id, Nombre FROM ARTICULOS WHERE ID LIKE ?", connection);
command.Parameters.AddWithValue("?", "%" + Convert.ToInt32(text) + "%");
break;
}
try
{
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
string list = "";
list += reader.GetValue(0).ToString() + "\t";
list += reader.GetValue(1).ToString();
this.listBox1.Items.Add(list);
}
}
catch (Exception ex)
{
DialogResult result = MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK);
this.Close();
}
connection.Close();
Id
的部分仍然没有这样做。
第二:*“如果ID是数字字段,则选择...... WHERE ID不应使用LIKE”。我认为这是必要的。我不需要搜索一个数字,我需要搜索一个喜欢插入的数字。例如,如果用户选择Id
并插入1,则结果不能仅为1,它可以是11,111,231等。任何包含1的数字(与{{1一样) }})。
最后:大写和小写函数是必需的。我使用和不使用它们来测试代码,结果是更完整的这些功能。这是代码:
Nombre
答案 0 :(得分:3)
问题(或至少一个问题)是您尝试使用参数作为列名。您不能这样做 - 只能参数化值。列和表名必须是SQL本身的一部分。
例如,这个:
case "Nombre":
command = new OleDbCommand("SELECT Id, Nombre FROM ARTICULOS WHERE ? LIKE ? OR ? LIKE ?", connection);
command.Parameters.AddWithValue("?", Combo);
command.Parameters.AddWithValue("?", "%" + LowercaseFirst(text) + "%");
command.Parameters.AddWithValue("?", Combo);
command.Parameters.AddWithValue("?", "%"+UppercaseFirst(text)+"%");
应该是:
case "Nombre":
command = new OleDbCommand(
"SELECT Id, Nombre FROM ARTICULOS WHERE Nombre LIKE ? OR Nombre LIKE ?",
connection);
command.Parameters.AddWithValue("?", "%" + LowercaseFirst(text) + "%");
command.Parameters.AddWithValue("?", "%"+UppercaseFirst(text)+"%");