1

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

数据库的设置如下:

城市

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

公园

  • ParkId (PK, int, not null)
  • CityId (FK, int, not null)
  • 名称(nchar(30),空)
  • 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;
    }
4

1 回答 1

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);
于 2012-04-30T19:26:05.383 回答