4

私はこの素敵な惑星で私の時間に多くのパラメータ化クエリを作成しましたが、このようなエラーは発生していません... WTFudge?!?!SqlCeパラメータでエラーが発生しました

ERROR:

There was an error parsing the query. [ 
Token line number = 1, 
Token line offset = 20, 
Token in error = @table ] 

明らかにコンパイラが私のSQL文を好きではありません...しかし、私は何の問題を見ていません?

ここに私のコードです。

using (SqlCeConnection con = new SqlCeConnection(_connection)) 
{ 
    string sqlString = "SELECT @colID FROM @table WHERE @keyCol = @key"; 

    SqlCeCommand cmd = new SqlCeCommand(sqlString, con); 
    cmd.Parameters.Add(new SqlCeParameter("@table", tableName)); 
    cmd.Parameters.Add(new SqlCeParameter("@colID", columnIdName)); 
    cmd.Parameters.Add(new SqlCeParameter("@keyCol", keyColumnName)); 
    cmd.Parameters.Add(new SqlCeParameter("@key", key)); 

    try 
    { 
     con.Open(); 
     return cmd.ExecuteScalar(); 
    } 
    catch (Exception ex) 
    { 
     Console.Write(ex.Message); 
     throw new System.InvalidOperationException("Invalid Read. Are You Sure The Record Exists", ex); 
    } 
    finally 
    { 
     if (con.State == ConnectionState.Open) 
      con.Close(); 
     cmd.Dispose(); 
     GC.Collect(); 
    } 
} 

非常に単純なSQL文です。私は "@テーブル"が愚かに予約されていたり、何か...されている可能性がありますので、@テーブル名を試したので、@ var、@すべて!問題が何であるか知りません。

デバッグ中に、実際に@ tableパラメータがSqlCeParameterCollectionに存在することが確認されました。一日でクリア!

Image: Debug Information

+1

シンタックスと機能が制限されています。テーブル(またはビュー)名にパラメータを使用することはできません。 –

+0

これはSqlExpressで動作しますか? –

+0

いいえ、率直に言って、私はtablenameのパラメータを受け入れるSQLエンジンを知らない。 C#で動的クエリをいつでも作成できます(文字列を使用)。 –

答えて

4

あなたはC#であるので、(保存されprocsのではなく)

string sqlString = "SELECT " + columnIdName + 
" FROM " +tableName "WHERE " + keyColumnName + "= @key"; 

あなたはcolumnIdName、tableNameの、keyColumnNameは、すべての値のリストに(またはで制限されていることを確認したくなるでしょう少なくとも50文字までの長さに制限してください。そうでなければ、この手順は安全性とSQLインジェクション攻撃に最適化されています。

+0

ここにSQLインジェクション? – Coops

+0

@CodeBlend答えをお読みくださいでしたか?テーブル名はパラメータにすることはできません。文字列を作成する前にテーブルテーブル/カラム名を調べること、非アルファ文字列を許可しないことなど、悪意のあるユーザのコンテンツを文字列から守るための戦略を開発者が決めるのは開発者次第です私は彼のアプリについてもっと知らずに彼のためにそれをすることはできません。 – MatthewMartin

+0

@MathewMarting十分にあなたは有効な点を作っています。もし私がもっと詳しく読んだら、私はコメントしていないでしょう、それは私の悪いことです。詳細な応答をありがとう。 – Coops

1

これはSqlCeでも影響を受けました。しかし、Sql ServerとSqlExpressでは、テーブル名にpaarameterを使用できます。

関連する問題