C# 填充文本框时,数据类型对于布尔运算无效

C# 填充文本框时,数据类型对于布尔运算无效,c#,database,ado.net,C#,Database,Ado.net,我得到了一个组合框,其中表作为数据源,ID作为值成员,名称作为显示成员。 从组合框中选择名称应使用数据填充6个文本框 例外情况: The data type is not valid for the boolean operation. [ Data type (if known) = int,Data type (if known) = nvarchar ] 代码: 表格详情: 跟进我的评论(注意我从未使用过SQL CE,但我非常肯定(99.9%)这是正确的) 在SQL查询字符串中,用单引号

我得到了一个组合框,其中表作为数据源,ID作为值成员,名称作为显示成员。 从组合框中选择名称应使用数据填充6个文本框

例外情况:

The data type is not valid for the boolean operation. [ Data type (if known) = int,Data type (if known) = nvarchar ]
代码:

表格详情:


跟进我的评论(注意我从未使用过SQL CE,但我非常肯定(99.9%)这是正确的)

在SQL查询字符串中,用单引号(
)括住客户id。对于字符(char\varchar等)和日期值,在SQL中使用单引号(“nomral”SQL至少)。传递数值时不带单引号

您没有指出哪一行给了您异常,但是根据表结构和您正在做的事情(顺便说一句,您在问题中给出了很详细的信息),错误消息似乎告诉您正在尝试将int与varchar进行比较,这是不允许的(因为它们是不同的数据类型,如错误所示)

要解决此问题,只需从WHERE子句中的值中删除单引号,并按如下方式构造查询:

String Code = "SELECT * FROM Customers WHERE CustomerID=" + cBox1.SelectedValue;

谢谢你,这对我有用。 我在
comboBox2
中有一些客户的名字。根据所选的名字
textbox
将返回
CustomerID
和分配日期值。 以下是代码:

   private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            if(comboBox2.SelectedIndex>0)
            {
                con = new SqlCeConnection(s);
                con.Open();
                string code = "select CustomerID,Date_of_Allocation from lockerdetails    
                where CustomerName='" + comboBox2.SelectedValue.ToString() + "'";

                SqlCeDataAdapter da = new SqlCeDataAdapter(code, con);
                SqlCeCommandBuilder cmd = new SqlCeCommandBuilder(da);
                DataSet ds = new DataSet();
                da.Fill(ds);
                textBox1.Text = ds.Tables[0].Rows[0]["CustomerID"].ToString();
                textBox5.Text = ds.Tables[0].Rows[0]["Date_of_Allocation"].ToString();
            }
        }
        catch(SystemException se)
        {
            MessageBox.Show(se.Message);
        }

CustomerID
是一个int,您正在传递一个字符串。我没有使用SQL CE,但您可以尝试以下操作:
“从客户选择*,其中CustomerID=“+cBox1.SelectedValue
(即,去掉SQL查询中的单引号)。谢谢,但现在我得到了此异常。
解析查询时出错。[令牌行编号=1,令牌行偏移量=53,令牌出错=数据]
请发布您使用的查询字符串。此外,请使用调试器编写代码,并查看构建查询时
cBox1的值。SelectedValue
非常感谢。这很好,但我不确定第二个异常。我在这一行中得到了错误
da.Fill(ds)
我不确定查询字符串是指连接字符串吗?不客气。查询字符串是指传递给适配器的SQL查询。当您调用
Fill
时,是否仍会出现异常?哦,很抱歉,是您刚才给我的那一个
string code=“SELECT*FROM Customers WHERE CustomerID=”+cBox1.SelectedValue;
我仍然得到异常。编辑:用
if(cBox1.SelectedIndex>=0)替换
if(cBox1.SelectedIndex>0)时
我没有收到任何错误,但是当从组合框中选择第一个选择时,它不会填充文本框。当
SelectedIndex
为0时,您知道
SelectedValue
的值是多少吗?索引0应该是组合框中的第一个客户,它基于您的表架构,应该具有1的值。还有一件事要尝试-在您的查询字符串(
cBox1.SelectedValue.ToString()
)中添加
.ToList()
),因为
SelectedValue
正在返回一个
对象。虽然我怀疑这是个问题,因为它可以正常工作,但尝试不会有什么坏处。
   private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            if(comboBox2.SelectedIndex>0)
            {
                con = new SqlCeConnection(s);
                con.Open();
                string code = "select CustomerID,Date_of_Allocation from lockerdetails    
                where CustomerName='" + comboBox2.SelectedValue.ToString() + "'";

                SqlCeDataAdapter da = new SqlCeDataAdapter(code, con);
                SqlCeCommandBuilder cmd = new SqlCeCommandBuilder(da);
                DataSet ds = new DataSet();
                da.Fill(ds);
                textBox1.Text = ds.Tables[0].Rows[0]["CustomerID"].ToString();
                textBox5.Text = ds.Tables[0].Rows[0]["Date_of_Allocation"].ToString();
            }
        }
        catch(SystemException se)
        {
            MessageBox.Show(se.Message);
        }