2012-04-30 3 views
1

コンボボックスのデータセットを選択する際に、以前のComboBox。私はそれが第2の方法のSELECT文であると信じるように導かれてきましたが、なぜそれが機能していないのか分かりません。 "トークン行番号= 1、トークン行オフセット= 52、トークンエラー=データ]"私は、Parameter.AddWithValue、cmd.Parametersを使用しようとしました。 .Add、また値を無駄にする文字列として設定します。誰でも私にこの問題を正しく解決する方法を教えてもらえますか?ありがとうございました。次のように"トークンライン番号= 1、トークンラインオフセット= 52、トークンエラー=データ]"

データベースのセットアップがある:

都市

  • CityId(PK、INT、NOT NULL)
  • 名(NCHAR(20)、NULL)
  • ROWGUID( UNIQUEIDENTIFIER、NOT NULL)

公園

  • ParkId(PK、INT、nullでない)
  • CityId(FK、INT、nullでない)
  • 名(NCHAR(30)、NULL)
  • ROWGUID(UNIQUEIDENTIFIER)

ここで方法は次のとおりです。

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

答えて

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

を実際に、私は正しく、そのスペースを調整していた私のオリジナルの方法を。あなたのお勧めに続いて、私は今、このエラーを受け取ります: "DbType System.Data.DataRowViewから既知のSqlCeTypeへのマッピングが存在しません。" – PicoDeGallo

+0

@ ZakaryDrinanもし 'DataRowView'について不平を言っているのであれば、cboCities.SelectedValueは何とかintの代わりに' DataRowView'を返しているようです。どのようにデータを 'cboCities'にバインドしていますか? – Icarus

+0

cboCities.SelectedValueは、最初のメソッドのValueMemberであり、初期のメソッドはSELECTステートメントの2番目のメソッドバーと同じです(これが意味する場合)。 – PicoDeGallo

関連する問題