0

主キーを反映したSQLSELECTステートメントを動的に作成するとします。テーブルで主キーを検索してから、ステートメントを作成します。

問題は、取得する前に主キーを構成するフィールドのタイプがわからないことです。したがって、文字列または日付の場合は引用符を追加する必要がありますが、intの場合は追加しないでください。

Atm、私はそのようにやっています:

var type = field.GetType().Name;
if (type.ToLower().StartsWith("string") || type.ToLower().StartsWith("date"))
{
    field = "\"" + field + "\"";
} else if (type.ToLower().StartsWith("char"))
{
    field = "\'" + field + "\'";
}

このコードを使用すると、いくつかのSQLタイプを処理できますが、さらに多くのタイプがあります。

私の問題は、LinQと組み合わされていることです。コンテキストからDataContextオブジェクトとジェネリック型テーブルを取得しました。また、context.ExecuteQueryは、パラメーターに値を渡すことのみを許可します。Dynamic LinQも試しましたが、同じ問題が発生しました

誰かがより良い解決策を知っていますか?

4

2 に答える 2

4

これは単に SQL の書き方が間違っています。それをパラメータ化すると、これらの問題はすべて蒸発します (「どの日付形式を使用するか」などの問題も同様です。そしてもちろん、重要な問題: SQL インジェクション.

@whatever次に、TSQLに追加して使用するcmd.Parameters.AddWithValue("whatever", field)(または同様の)ケースになります。


更新 (コメントから): を使用していると述べているため、これは簡単になります: そのメソッドは、規則DataContext.ExecuteQueryを使用して完全にパラメーター化されています。string.Format

object field = ...;
var obj = db.ExecuteQuery<SomeType>(
      "select * from SomeTable where Id = {0}", field).ToList(); // or Single etc

文字列変換は必要ありません。

(最後のパラメーターは です。したがって、コンパイル時に用語の数が固定されていない場合はparams object[]、複数の個別の用語を渡すか、 を入力してobject[]それを渡すことができます。配列内の各用語は (ゼロベース) でマップされます)クエリ内の{0}, {1}, ... etc トークンへのインデックス){2}

于 2012-10-29T08:54:49.460 に答える
2

パラメータで試しましたか?たとえば、SQLServer をデータベースとして使用していて、次のクエリを実行する場合:

"SELECT * FROM someTable WHERE id = " + field;

次に、次のようなものを使用する必要があります。

"SELECT * FROM someTable WHERE id = @field"

コマンドにパラメーターを追加します。

SqlParameter param1 = new SqlParameter("@field", field);
command.Parameters.Add(param1);

編集: データベース プロバイダーが異なると、SQL クエリの構文が異なることに注意してください。アクセスの場合も同じです。

"SELECT * FROM someTable WHERE id = ?";
command.Parameters.AddWithValue("field", field);
于 2012-10-29T09:03:11.410 に答える