2016-05-20 7 views
1

10年および製品ラインに一致する製品を選択する際にARCHIVES_MASTER_TBLから取得した情報でこのデータセットを入力しようとしていますが、 : "1つまたは複数の必須パラメータに対して値が指定されていません。"複数の条件を持つSELECTステートメントからDataSetを入力する

OleDbConnection dbConn; 
OleDbDataAdapter dbCmdDecade; 

dbConn = new OleDbConnection(connectionString); 
dbConn.Open(); 

dbCmdDecade = new OleDbDataAdapter("Select * From ARCHIVE_MASTER_TBL WHERE DECADE_1=" + decade + "AND PRODUCT_LINE=" + productLine, dbConn); 
      DataSet ds = new DataSet(); 
dbCmdDecade.Fill(ds, "products"); 

それは「+ 『AND PRODUCT_LINE =』 + PRODUCTLINE」の部分を追加する前に働いていたが、私はより具体的かつ唯一の十年と製品

+1

間の誤解のためのスペースがない:あなたが持っているパラメータ化クエリを持つ代わりに

。しかし、これはあなたがSQLコマンドを書くべきではありません。パラメータはそれを行う唯一の方法です – Steve

+0

なぜこのように書くべきではありませんか?出来た。しかし、ANDのためのスペースは、私が投稿した問題を解決しなかった –

+0

列PRODUCT_LINEとDECADE_1のデータ型は何ですか? – Steve

答えて

1

あなたの両方に合うものを選択するための検索を必要と文字列を連結するSQLコマンドを記述しないでください。これはバグ(解析エラー)のよく知られたソースと
Sql Injection.は、代わりにあなたがあなたの値の正確なデータ型を指定し、データベースエンジンは変換

のためにすることなく、それらを使用できるようにするためのパラメータを使用する必要がありますと呼ばれるセキュリティリスクですたとえば、PRODUCT_LINE列がtext型であるため、この列を検索する場合は値を引用符で囲む必要がありますが、値に1つ以上の引用符が含まれている場合はどうなりますか?一重引用符を二重引用符に置き換える必要があります。すぐにクエリが判読できなくなり、バグの可能性のあるパスが増えます。

string cmd = @"Select * From ARCHIVE_MASTER_TBL 
       WHERE [email protected] AND [email protected]"; 

using(OleDbConnection dbConn = new OleDbConnection(connectionString)) 
using(OleDbDataAdapter dbCmdDecade = new OleDbDataAdapter(cmd, dbConn)) 
{ 
    dbConn.Open(); 
    dbCmdDecade.SelectCommand.Parameters.Add("@decade", OleDbType.Integer).Value = decade; 
    dbCmdDecade.SelectCommand.Parameters.Add("@line", OleDbType.VarWChar).Value = productline; 
    DataSet ds = new DataSet(); 
    dbCmdDecade.Fill(ds, "products"); 
} 

たくさん明確にし、あなたのコードと第二の条件のための前のスペースがありませんデータベース

関連する問題