4

私はこの素敵な惑星で多くのパラメーター化されたクエリを作成しましたが、このようなエラーをスローしたものはありません... WTFudge?!?!

エラー:

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 ステートメントです。「@table」は愚かに予約されているか何かだったのかもしれませんが、@tableName、@var、@everythingを試してみました!!! 何が問題なのかわからない。

デバッグ中に、実際に SqlCeParameterCollection に @table パラメータがあることを確認しました。そこにありました。晴天!!

画像: デバッグ情報

4

2 に答える 2

4

あなたはC#にいるので(ストアドプロシージャとは対照的に)

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

columnIdName、tableName、keyColumnName がすべて値のリストに制限されている (または、少なくとも長さを 50 文字に制限する) ことを確認する必要があります。それ以外の場合、この手順はセキュリティ不足や SQL インジェクション攻撃に対して最適化されています。

于 2011-07-27T15:50:12.573 に答える
1

これは、SqlCeでも私に影響を与えました。ただし、SQL ServerおよびSqlExpressでは、テーブル名にパラメータを使用できます。

于 2012-02-10T16:11:22.600 に答える