繁体   English   中英

“解析查询时出错。 [令牌行编号= 1,令牌行偏移量= 52,令牌错误=数据]”

[英]“There was an error parsing the query. [Token line number = 1, Token line offset = 52,Token in error = Data]”

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

数据库的设置如下:

城市

  • CityId(PK,整数,不为null)
  • 名称(nchar(20),null)
  • rowguid(唯一标识符,不为null)

公园

  • ParkId(PK,整数,不为null)
  • CityId(FK,int,不为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;
    }

我知道您提到您尝试对查询进行参数设置,但是如果您现在发布的代码引发了错误,那么我认为这与以下事实有关:您在“ ORDER BY”之前缺少空格; 否则,执行的查询将类似于:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM