OleDb 其中类似的语句错误

本文关键字:语句 错误 OleDb | 更新日期: 2023-09-27 18:30:21

我正在尝试通过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 是数值字段,请选择...其中 ID 不应使用 LIKE"。我认为这是必要的。我不需要搜索一个数字,我需要搜索一个插入的数字。例如,如果用户选择Id并插入 1,则结果不必只有 1,它可以是 11、111、231 等。任何包含 1 的数字(如 Nombre )。

最后:大写和小写函数是必需的。我测试了有和没有它们的代码,结果使用这些函数更完整。这是代码:

static string LowercaseFirst(string s)
        {
            // Check for empty string.
            if (string.IsNullOrEmpty(s))
            {
                return string.Empty;
            }
            // Return char and concat substring.
            return char.ToLower(s[0]) + s.Substring(1);
}
static string UppercaseFirst(string s)
{
            // Check for empty string.
            if (string.IsNullOrEmpty(s))
            {
                return string.Empty;
            }
            // Return char and concat substring.
            return char.ToUpper(s[0]) + s.Substring(1);
}

OleDb 其中类似的语句错误

问题(或至少一个问题)是您尝试使用参数作为列名。你不能这样做 - 只能参数化。列名和表名必须是 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)+"%");