0

私のプログラミングタスクでは、暗い路地を下りて、そうしなかったらよかったのにと思いましたが、今は後戻りすることはできません。

テーブル名、列名、ID値がクエリ文字列パラメータから取得されるSQLステートメントを作成しています。("SELECT [{0}] FROM [{1}] WHERE [Id] = {2};", c, t, id)

しかし、見た目ほど悪くはありません、私は保護されています:

  • 認証されたユーザー(つまり、サインインしたユーザー)のみが実行できますPage_Load
  • テーブルと列の両方が事前に存在することを確認しています(使用GetSchemaなど)
  • Idが整数であることを事前に確認しています
  • すべてのテーブルにId列があります
  • データベース接続は適度に安全です

フィールド値はタイプNVARCHAR(4000)またはNVARCHAR(MAX)であると予想されるため、 LINQが好きなので、回避ExecuteScalarし、LINQを試しています。ExecuteQueryしかし、私は再び私の深さから少し外れています。

私はこれまでに持っています:

    Dim db As New MyDataContext

    Dim result = db.ExecuteQuery(Of ITable)("SELECT [{0}] FROM [{1}] WHERE [Id] = {2};", c, t, id)
  • これは正しい方法ですか?
  • 最初の行と最初の列の値を取得するにはどうすればよいですか?
  • より良い代替案はありますか?

PSこれはSQLServer2005データベースです

助けていただければ幸いです。ありがとう。

4

1 に答える 1

1

SQL Server では、テーブルと列が静的に認識されている必要があります。コマンド パラメーターを使用してそれらを提供することはできません。あなたは言うことができません

select * from @tableName

テーブル名を変数にすることはできないためです。

識別子が適切にエスケープされるように、C# を使用して SQL 文字列を作成する必要があります。エスケープは次のように機能します。

var escaped = "[" + rawUntrustedUserInput.Replace("]", "]]") + "]";

これは安全です。

于 2012-05-11T18:20:47.427 に答える