パラメータを含むSelectCommandは空の結果を提供します

現在私はコードを少しきれいにしていますが、VSは私に教えてくれました。代わりにSQLコマンドの SqlParameter を使用する方が良いでしょう。 だから私は自分のコードを変更することにしましたが、残念ながら今は結果が得られず、理由もわかりません。 ここに私のコードの一部です:

...    
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が空であるのはなぜですか? (複合ストリングを使用すると、選択が機能します)何が問題になりましたか?

グリーツ

2
追加された
ビュー: 6
パラメータとして列名を渡すことはできません
追加された 著者 Lucas_Santos,
あなたの複合文字列を追加しました
追加された 著者 Reniuz,
SqlParameter の方がずっときれいです。私のコードがうまくいかないのは興味深いでしょう。 @Lucas_Santosこれを列名に変更しましたが、 dt はまだ空です。グリーツ
追加された 著者 hofmeister,

3 答え

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

where句がtrueに評価されると、ディクショナリ・テーブル内のすべてのレコードが取得され、falseの場合はレコードが取得されません。 @fromの内容は辞書テーブルのフィールド名として決して扱われません。

2
追加された
彼らが同じであれば、あなたはテーブル全体を得るでしょう。パラメータを使用してフィールド名を指定する場合は、Sql文字列を動的に作成する必要があります。これを行う最も安全な方法は、spExecuteSqlを使用することです。 msdn.microsoft.com/en- us/library/ms188001.aspx
追加された 著者 Ben Robinson,
さて、私はそれをテストし、あなたは正しいです!問題は本当にwhere句です。 (カラム位置のパラメータは正常に動作します)。より良い理解のために、両方の値を比較する WHERE @FROM LIKE @ SEARCHSTRING が同じ場合は、完全な表を取得します。 @FROM にパラメータを追加することは可能ですか?その位置で CommandText の文字列を合成するだけですか?ありがとう、greetz。
追加された 著者 hofmeister,

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

あなたが取っているアプローチは、いくつかの理由から悪い考えです。まず、このような方法でsqlコマンドを渡すと、そのクエリを実行するたびにサーバを再コンパイルしなければならないため、サーバに負荷がかかり、パフォーマンスが低下します。第二に、セキュリティを脅かすリスクは、選択したステートメントを表の構造を傍受した人に通知するためです。第3に、このようなselect文を使用すると、コピー貼り付けをしないでコードを再利用したい場合に便利です。

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

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

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

DECLARE @queryString VARCHAR(3000)

SET @queryString ='SELECT id, '[email protected]+' AS from, '[email protected]+' AS to FROM Dictionary WHERE +'@FROM+' LIKE %'[email protected]+'%'

@queryStringを実行するためにsp_executesqlを使用するだけです

クエリ文字列を構築している間にエラーが発生した場合は、Varcharとしてパラメータをキャストする必要があるかもしれません

1
追加された
@ Taz私が投稿した例を更新して、クエリ文字列に%
追加された 著者 Purplegoldfish,
@Tazはこれを非常に簡単にチェックしますが、これを少し拡張する方法を示しています。 pastebin.com/tZqQpzmW
追加された 著者 Purplegoldfish,
@taz文字列を選択すると、通常はcolumn = 'stringtext'が実行されますが、変数を使用しているときには、作成する文字列はcolumn = stringtextのようになります。あなたがサーバーに渡すparam
追加された 著者 Purplegoldfish,
はい、フィールド名を渡す必要があります。エンドユーザーは、選択した列をドロップダウンリストで変更することができます(私はそれが安全でないことは分かっていましたが、他の方法はわかりません)。プロシージャを作成し、プロシージャに動的フィールドを追加し、ここをクリックしてください。また、SQLの更新、削除などのために?グリーツ
追加された 著者 hofmeister,
さて、あなたが言ったような手続きを追加しました。今私は、 '%と%'を検索文字列に追加する必要があるという問題があります。 SQL Serverからプロシージャを実行すると、問題ではない、すべて正常に動作しますが、単引用符を追加する方法はありますか? C#で私は: cmd.Parameters ["@ SEARCHSTRING"]。Value = "'%string%'"; 。 SQLサーバーで、私は exec test_手続き@FROM = 'FROMVALUE'、@ TO = 'TOVALUE'、@ SEARCHSTRING = 'STRING' を実行しました。グリーツ
追加された 著者 hofmeister,
これはうまくいきますが、等号( = )で選択しようとすると、列がたとえばvarcharの場合は単一引用符がなくなります。私は、SQL Serverでの突っ込みが予想されるプロシージャをどのように実行できるか、面白いと思います。実際の問題は解決されます。グリーツ
追加された 著者 hofmeister,
誤解を避けるために、手順は正しく動作します。パラメータが文字列の場合、SQL Serverからプロシージャを実行する方法を知りたいと思います。たとえば、 SEARCHSTRING が列ではないことをSQL Serverが教えてくれています。それは正しくあります。検索の正しい構文は ['SEARCHSTRING'] です。みんな、ありがとう!グリーツ。
追加された 著者 hofmeister,

なぜこのような質問を書いたのですか?

   "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キーワードであることに注意してください。そのため、 "[]"で囲んで正しい解釈をしてください。

お役に立てれば...

0
追加された