2

現在、コードを少しクリーンアップし、VSからSqlParameter、複合語の代わりにsqlコマンドにforを使用する方がよいと言われましたstring。そこで、コードを変更することにしました。残念ながら、結果が得られず、理由もわかりません。これが私のコードの一部です:

...    
DataTable dt = new DataTable();
SqlConnection connection = new SqlConnection(GetSQLConnectionString());
SqlDataAdapter sqlSelect = new SqlDataAdapter();
try
{
    connection.Open();
    sqlSelect.SelectCommand = connection.CreateCommand();
    sqlSelect.SelectCommand.CommandText = "SELECT id, @FROM AS \"from\", @TO AS \"to\" FROM Dictionary WHERE @FROM LIKE @SEARCHSTRING";
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@FROM", this.from));
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@TO", this.to));
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@SEARCHSTRING", "'%" + this.SearchField.Text + "%'"));

    sqlSelect.Fill(dt);
    connection.Close();
}
catch(SqlException e)
...

例外はありません。検索後にdtが空になるのはなぜですか?(複合文字列を使用すると、選択が機能します。)何が問題でしたか?

グリーツ

4

4 に答える 4

2

そのようなパラメーターを使用してフィールド名を指定することはできません。where句WHERE @FROM LIKE @SEARCHSTRINGでは、パラメータの値とパラメータの値を比較して@FROMいます@SEARCHSTRING

where 句が true と評価された場合、ディクショナリ テーブル内のすべてのレコードが取得されます。 false と評価された場合、レコードは取得されません。@from の内容をディクショナリ テーブルのフィールド名として扱うことはありません。

于 2011-10-27T13:43:58.740 に答える
1

人々がここで言ったように、問題はフィールド名をパラメータとして渡すことができないということです。

あなたが取っているアプローチは、いくつかの理由で悪い考えです。まず、この方法で sql コマンドを渡すと、そのクエリを実行するたびにサーバーが再コンパイルする必要があり、サーバーに余分な負荷がかかり、パフォーマンスが低下します。第二に、select ステートメントをこのように送信すると、傍受した人がテーブル構造を見ることができるため、セキュリティ上のリスクがあります。第 3 に、このような select ステートメントを使用することは、コードを再利用したい場合に、コピー ペーストなしではできないことを意味します。

私がお勧めするのは、ストアドプロシージャに切り替えることです。パラメータなどを渡すことはできますが、C# から SQL を取り出し、関連するものだけを残すため、コードが改善されます。

このような select ステートメント内で使用するフィールド名を本当に渡す必要がある場合は、SQL でこれを行い、クエリ文字列を作成してから、sp_executesql を使用して実行できます。

基本的にあなたがすることは、次のようなクエリ文字列を宣言することです

DECLARE @queryString VARCHAR(3000)

SET @queryString ='SELECT id, '+@FROM+' AS from, '+@TO+' AS to FROM Dictionary WHERE +'@FROM+' LIKE %'+@SEARCHSTRING+'%'

次に、sp_executesql を使用して @queryString を実行します

クエリ文字列の作成中にエラーが発生した場合は、パラメーターを Varchar としてキャストする必要がある場合があります

于 2011-10-27T13:56:48.457 に答える
0

なぜこのようなクエリを書いたのですか?

   "SELECT id, @FROM AS \"from\", @TO AS \"to\" FROM Dictionary WHERE @FROM LIKE @SEARCHSTRING";

テーブルから @FROM を取得しようとしていて、それをパラメーターとして渡そうとしていますが、どうすればうまくいくのでしょうか? また、なぜスラッシュを含めたのですか? 彼らは物事を乱雑にし、それらを取り除きます。Select クエリは、"WHERE" 句のみで入力パラメーターを受け取り、それ以外の場所は受け取りません。

これに置き換えてみてください

"SELECT id, FROM AS 'from', TO AS 'to' FROM Dictionary WHERE FROM LIKE @SEARCHSTRING";

また、最後に出現したものを除くすべてを削除します。

sqlSelect.SelectCommand.Parameters.Add

また、"FROM" も SQL キーワードであるため、"[]" で囲んで正しい方法で解釈されるように注意してください。

お役に立てれば...

于 2011-10-27T13:44:10.633 に答える