System.Data.OleDb.OleDbException:'条件表达式中的数据类型不匹配。'

时间:2018-11-26 02:54:46

标签: c# ms-access

我是编码新手,目前正在尝试制作此条形码跟踪器程序。到目前为止,我进行了搜索并找到了我需要的东西,但是现在找不到该问题的答案(或者无法理解人们想说的话)。所以这是我的问题:

我正在使用Ms Access作为数据库,但是作为数字数据类型,Access允许我输入最多10位数字。另外,我知道有些条形码包含字母字符,因此我必须将数据类型更改为文本。如果包含条形码的列的数据类型是数字,则程序可以工作。当我将列的数据类型更改为文本时,程序会给出数据类型不匹配错误。

这是我的代码:

public partial class Form1 : Form
    {
        OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\Barcode\\Database.accdb; Persist Security Info=False");
        OleDbDataReader DataReader;
        OleDbCommand command;
        bool flag = false;

        public Form1()
        {
            InitializeComponent();
        }
        public void Form1_Load(object sender, EventArgs e)
        {
        }
        public void txt_UPC_KeyDown(object sender, KeyEventArgs e)
        {           
            if ((txt_UPC.Text == "") && (e.KeyCode == Keys.Enter)) 
            {
                e.Handled = true;
            }
            else
            {
                if (e.KeyValue == (char)Keys.Enter)
                {
                    connection.Open();
                    string SelectQuery = "SELECT * FROM Products where [UPC]=" + txt_UPC.Text.ToString();
                    command = new OleDbCommand(SelectQuery, connection);                   
                    DataReader = command.ExecuteReader();  **//Error occurs here...**
                    while (DataReader.Read())
                    {
                        txtProduct.Text = DataReader["Product"].ToString();
                        txtPrice.Text = DataReader["Price"] + " ₺";        
                        if (DataReader["UPC"].ToString() == txt_UPC.Text)   
                        {
                           flag = true;
                        }
                    }
                    if (flag == true)
                    {
                            Test.Text = "Known Product";
                            txt_UPC.Text = "";
                        flag = false;
                    }
                    else                    
                    {                                                
                            Test.Text = "Unknown Product";                                               
                    }
                    connection.Close();
                }
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

建议对文本类型字段参数使用撇号定界符。

string SelectQuery = "SELECT * FROM Products where [UPC]='" + txt_UPC.Text.ToString() + "'";

答案 1 :(得分:0)

您需要完整的SQL Server表达式。您当前有

string SelectQuery = "SELECT * FROM Products where [UPC]=" + txt_UPC.Text.ToString();

假设txt_UPC.Text是一个字符串,您可能需要这样做:

string SelectQuery = "SELECT * FROM Products where [UPC]= '" + txt_UPC.Text.ToString() + "'";

这会将您的字符串括在SQL语言规定的单引号中。对于它的价值,您可能也不需要.ToString()

而且,像您正在做的那样串联SQL是一个非常糟糕的主意,尤其是当您包含用户输入的文本时。阅读“ SQL注入”并使用参数化的SQL。