我正在尝试根据前一个ComboBox的选择为ComboBox选择一组数据。我一直认为它是第二种方法中的SELECT语句,但我无法弄清楚它为什么不起作用。当我运行应用程序时,我收到此错误:“解析查询时出错。[令牌行号= 1,令牌行偏移= 52,错误令牌=数据]”我尝试使用Parameter.AddWithValue,cmd.Parameters 。添加,并将值设置为字符串无效。有人会介意教我如何正确解决这个问题吗?谢谢。
数据库的设置如下:
城市
公园
以下是方法:
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;
}
答案 0 :(得分: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);