Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OleDb where like语句错误_C#_Oledb_Oledbcommand_Oledbdatareader - Fatal编程技术网

C# OleDb where like语句错误

C# OleDb where like语句错误,c#,oledb,oledbcommand,oledbdatareader,C#,Oledb,Oledbcommand,Oledbdatareader,我试图通过windows窗体应用程序使用ID(整数)或名称(字符串)在oledb数据库中进行搜索。用户使用组合框选择搜索类型,因为可能的搜索类型不同,我使用开关创建两个不同的查询: string Combo = this.comboBox1.SelectedItem.ToString(); string text = this.textBox1.Text; connection.Open(); OleDbCommand comman

我试图通过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
中选择时,会导致错误
输入字符串的格式不正确
(使用注释和非注释指令)

知道如何更改代码来读取我想在数据库中搜索的项目吗


编辑

谢谢你的任命。看到答案,我会尝试回答(太多的信息不能作为评论)。首先,我按照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);
}
问题(或至少有一个问题)是您试图使用参数作为列名。您不能这样做-只有值可以参数化。列和表名必须是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)+"%");
问题(或至少有一个问题)是您试图使用参数作为列名。您不能这样做-只有值可以参数化。列和表名必须是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)+"%");
问题(或至少有一个问题)是您试图使用参数作为列名。您不能这样做-只有值可以参数化。列和表名必须是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)+"%");
问题(或至少有一个问题)是您试图使用参数作为列名。您不能这样做-只有值可以参数化。列和表名必须是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)+"%");


到底在哪一行?
text
的值是多少?您的
CurrentCulture是什么?
如果ID是数字字段,请选择。。。其中ID不应使用LIKE。
Restro Fad
问题,当您调试此代码时,假设您已通过代码,那么
Combo
的值是多少?它是实际文本吗?也许您可以将代码更改为此,以确保它正确读取所选值
string Como=this.comboBox1.GetItemText(this.comboBox1.SelectedItem)
@Steve,@JonSkeet,@DJKRAZE。我在与edit相同的帖子中回答了。而且combo得到了一个真正的字符串,进入了所需的大小写。具体在哪一行?文本的值是多少?你的当前文化是什么?如果ID是一个数字字段,那么选择…ID不应该使用的位置。像。
Restro Fad
问题例如,当您调试此代码时,假设您已逐步遍历了代码,
Combo
的值是多少?它是实际文本吗?也许您可以将代码更改为此,以确保它正确读取所选值
string Como=this.comboBox1.GetItemText(this.comboBox1.SelectedItem)
@Steve,@JonSkeet,@DJKRAZE。我在与edit相同的帖子中回答了。而且combo得到了一个真正的字符串,进入了所需的大小写。具体在哪一行?文本的值是多少?你的当前文化是什么?如果ID是一个数字字段,那么选择…ID不应该使用的位置。像。
Restro Fad
问题例如,当您调试此代码时,假设您已逐步遍历了代码,
Combo
的值是多少?它是实际文本吗?也许您可以将代码更改为此,以确保它正确读取所选值
string Como=this.comboBox1.GetItemText(this.comboBox1.SelectedItem)
@Steve,@JonSkeet,@DJKRAZE。我在与edit相同的帖子中回答了。而且combo得到了一个真正的字符串,进入了所需的大小写。具体在哪一行?文本的值是多少?你的当前文化是什么?如果ID是一个数字字段,那么选择…ID不应该使用的位置。像。
Restro Fad
问题例如,当您调试此代码时,假设您已逐步遍历了代码,
Combo
的值是多少?它是实际文本吗?也许您可以将代码更改为此,以确保它正确读取所选值
string Como=this.comboBox1.GetItemText(this.comboBox1.SelectedItem)
@Steve,@JonSkeet,@DJKRAZE。我在与edit相同的帖子中回答了。combo也得到了一个真正的字符串,进入了所需的大小写。了解Lower/Upper两个方法对输入文本的作用会很有趣,因为LIKE不应该关心大小写。@Steve:是的,这肯定是一个奇怪的问题,但我怀疑这不是最重要的问题问题的原因。了解Lower/Upper两种方法对输入文本的作用会很有趣,因为LIKE不应该关心大小写。@Steve:是的,这肯定是个奇怪的问题,但我怀疑我