【问题标题】:"There was an error parsing the query. [Token line number = 1, Token line offset = 52,Token in error = Data]"“解析查询时出错。[Token line number = 1, Token line offset = 52,Token in error = Data]”
【发布时间】:2012-04-30 19:18:59
【问题描述】:

我正在尝试根据前一个 ComboBox 的选择为 ComboBox 选择一组数据。我一直相信这是第二种方法中的 SELECT 语句,但我无法弄清楚为什么它不起作用。当我运行应用程序时,我收到此错误:“解析查询时出错。[令牌行号 = 1,令牌行偏移量 = 52,错误中的令牌 = 数据]”我尝试使用 Parameter.AddWithValue、cmd.Parameters .Add,并将值设置为字符串也无济于事。有人介意教我如何正确解决这个问题吗?谢谢。

数据库设置如下:

城市

  • CityId(PK,int,非空)
  • 名称 (nchar(20), null)
  • rowguid(唯一标识符,非空)

公园

  • ParkId(PK,int,非空)
  • CityId (FK, int, not null)
  • 名称 (nchar(30), null)
  • rowguid(唯一标识符)

方法如下:

private void cboCities_SelectedIndexChanged(object sender, EventArgs e)
{
    if (cboCities.SelectedIndex > -1)
    {
        SqlCeConnection cn = new SqlCeConnection(@"Data Source = \Program Files\ParkSurvey\ParkSurvey.sdf; Persist Security Info = False; Password = *");
        cn.Open();
        SqlCeCommand cmd = cn.CreateCommand();
        cmd.CommandText = "SELECT Name FROM [Parks] WHERE CityId =" + cboCities.SelectedValue + "ORDER BY Name ASC";
        SqlCeDataAdapter da = new SqlCeDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        cn.Close();
        cboParks.ValueMember = "ParkId";
        cboParks.DisplayMember = "Name";
        cboParks.DataSource = ds.Tables[0];
        cboParks.SelectedIndex = -1;
    }

【问题讨论】:

    标签: c# sql


    【解决方案1】:

    我知道您提到您尝试对查询进行参数化,但如果您现在收到的错误是与您发布的代码一起引发的,那么我认为这与您在“之前缺少一个空格”这一事实有关订购";否则,执行的查询将类似于:

    SELECT Name FROM [Parks] WHERE CityId =5ORDER BY Name ASC;
    

    这显然是无效的 SQL。

    您的查询应该是:

    "SELECT Name FROM [Parks] WHERE CityId =" + cboCities.SelectedValue + " ORDER BY Name ASC";
    

    话虽如此,我会考虑对查询进行参数化以避免 SQL 注入攻击。使用cmd.Paramters.AddWithValue 是比编写此内联SQL 语句更好的方法。

    你的查询可以写成:

    "SELECT Name FROM [Parks] WHERE CityId = @CityID ORDER BY Name ASC";
    

    你可以这样添加参数:

    cmd.Parameters.AddWithValue("@CityID",cboCities.SelectedValue);
    

    【讨论】:

    • 其实我原来的方法已经正确调整了那个空间。根据您的建议,我现在收到此错误:“不存在从 DbType System.Data.DataRowView 到已知 SqlCeType 的映射。”
    • @ZakaryDrinan 如果它抱怨DataRowView,在我看来,cboCities.SelectedValue 以某种方式返回DataRowView 而不是int。你如何将数据绑定到cboCities
    • cboCities.SelectedValue 是初始方法的 ValueMember,初始方法与 SELECT 语句的第二个方法栏相同,如果您是这个意思。
    猜你喜欢
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多