1

SQL Server データベース (バージョン 10.50.4000) への完全に機能する (安全な) セッションを取得しました。これはパブリック変数に格納されます。

SqlConnection conn = new SqlConnection();

SELECTクエリを実行したいだけです。それ以外の場合、ユーザー アカウントには権限がありません。

クエリは、単純なテキスト ボックスに挿入される 1 つのユーザー エントリのみで作成されます。

残念ながら、元のコマンド テキストを教えてはいけません。だから私はあなたのためにそれを簡単にします:

function print_users(string filtervalue)
{
    SqlCommand cmd = null;
    cmd = new SqlCommand("SELECT users From groups WHERE group_name LIKE '%@fv%'", this.conn)

    cmd.Parameters.Add("@fv", SqlDbType.NVarChar);
    cmd.Parameters["@fv"].Value=filtervalue;

    rdr = cmd.ExecuteReader();

    while(rdr.Read())
    {
        //Do something with the answer from the DB
    }
}

しかし、これではうまくいきません。も試しAddWithValueましたが、うまくいきませんでした。

置き換えが必要な行にストップポイントを作成するときは@fv、コードを行ごとに調べることができます。@fvそして、置き換えるべきコマンドがエラーなしで処理されていることがわかります。しかし@fv、置き換えられていません (または、少なくともデバッグ コンソールに置き換えが表示されません)。

私は何を間違っていますか?

編集:

返信ありがとうございます。一重引用符 ( ' ) を省略するとうまくいきました。

また、これは文字列の置換ではないことも学びました。ありがとうございました。

一言だけ: 接続が常に開いたままになっているわけではありません。必要がなくなると、すぐに閉じられます。必要に応じて再確立します-サンプルコードにそれを書くのを忘れていました。

再度: ご協力ありがとうございます。

4

2 に答える 2

2

デバッグ セッションで置き換えられることはありません。置換はSQLサーバーコード自体で発生します...

クライアント (コード) は、SQL 文字列とパラメーターの値の両方を別のものとしてサーバーに送信します。SQL エンジンは、実行中にパラメータをその値に「置換」します。

また、クエリ内ではなく、パラメーター値内に「ワイルドカード」を配置する必要があります。

cmd = new SqlCommand("SELECT users From groups WHERE group_name LIKE @fv ", this.conn)
cmd.Parameters.Add("@fv", SqlDbType.NVarChar);
cmd.Parameters["@fv"].Value= "%" + filtervalue + "%";
于 2013-06-24T15:03:38.830 に答える
1

文字列リテラル内にあるため、パラメーターが機能していません。次のように文字列を作成します。

cmd = new SqlCommand("SELECT users From groups WHERE group_name LIKE '%' + @fv + '%'");

私たちがそうしている間、そのようなグローバルな接続を維持することは悪いことです. 特に Web アプリでは、奇妙な副作用を引き起こす可能性があります。代わりに、グローバル接続文字列を保持し、その文字列を使用して、要求ごとに新しい接続を作成します。

また、「置換」はここでは間違った言葉です。Sql パラメーターは、機能している場合でも置き換えられることはありません。それが要点です。どの時点でも、クエリに文字列の置換はありません。@fvストアド プロシージャでサーバー レベルで変数を宣言し、データをその変数に直接割り当てたようなものです。この方法では、クエリのデータ部分が実行プロセス全体で分離されたままになるため、パラメーター置換コードに脆弱性が生じる可能性はありません。同様に、クエリのパラメーターを「サニタイズ」するという観点から考えないでください。代わりに、データを隔離するという観点から考えてください。

于 2013-06-24T15:08:03.350 に答える