1

以前の ComboBox の選択に基づいて ComboBox のデータ セットを選択しようとしています。2 番目の方法の SELECT ステートメントであると信じるようになりましたが、なぜ機能しないのかわかりません。アプリケーションを実行すると、「クエリの解析中にエラーが発生しました。[トークン行番号 = 1、トークン行オフセット = 52、エラー中のトークン = データ]」というエラーが表示されます。 .追加し、値を文字列として設定しても無駄です。これを正しく解決する方法を教えてくれませんか?ありがとうございました。

データベースのセットアップは次のとおりです。

都市

  • CityId (PK、int、null 以外)
  • 名前 (nchar(20)、ヌル)
  • rowguid (一意の識別子、null 以外)

公園

  • ParkId (PK、int、null 以外)
  • CityId (FK、int、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 に答える