0

次のコードを検討してください。

SqlConnection conn = new SqlConnection(@"connection string");

SqlCommand ourCommand = new SqlCommand(String.Format(
    @"SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE '@FL1'"), conn);
ourCommand.CommandTimeout = 6000;

ourCommand.Parameters.AddWithValue("@FL1", TextBox1.Text);

SqlDataAdapter adapter = new SqlDataAdapter(ourCommand);
DataTable dt = new DataTable();

conn.Open();
adapter.Fill(dt);
GridView1.DataSource = dt;

GridView1.DataBind();

問題は、それdatatableが空であるということです。これは、コマンドが実行されなかったか、誤ったクエリが生成されたことを意味します。私は何が欠けていますか?接続とクエリは有効です。パラメータなしのコマンドも機能します。データベースエンジンはSQLServer2008R2です

4

6 に答える 6

6

パラメータ名を引用符で囲んでいるため、パラメータとしてではなく、値として扱われています。代わりにこれを試してください:

"SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE @FL1"

(SQLにあるよりも多くのパラメーターを指定している場合、既存のコードが例外をスローすることを実際に期待しています...)

コメントに記載されているように、どちらも必要ありませんstring.Format

于 2012-08-02T14:43:49.770 に答える
5

クエリは適切にフォーマットされたクエリではありません。

それ以外の:

String.Format(
    @"SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE '@FL1'")

使用する:

"SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE @FL1"

Jonがコメントしたように、パラメータ名をで囲む必要string.Formatも、パラメータ名を囲む必要もありません。また''、文字列でエスケープするものがないため、(を使用して)逐語的な文字列リテラルである必要はありません。@

于 2012-08-02T14:44:09.140 に答える
3

行をこれに変更してみてください(@ FL1の周囲の目盛りを削除してください)

SqlCommand ourCommand=new SqlCommand(
             "SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE @FL1",conn);
于 2012-08-02T14:44:11.500 に答える
1

パラメータを使用している場合は、一重引用符を使用する必要はありません。こちらのレッスンをご覧ください。

于 2012-08-02T14:45:02.323 に答える
1

まず、string.formatや@'sは必要ありません(エスケープ文字がなく、文字列が1行にあり、パラメータ化された文字列を使用していないため、どちらにも理由はありません)。 @FL1の前後に引用符は必要ありません。SqlCommandは@、引用符で区切られた部分文字列ではなく、文字列全体を'sで解析します。最終的なコードは、次のようになるはずです。

SqlCommand ourCommand=new SqlCommand("SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE @FL1",conn);

他のすべてはあなたが同じに保つことができると思います。

于 2012-08-02T14:46:43.330 に答える
0

パーセントで連結を強制する必要があります%->

SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE **'%'** + @FL1 + **'%'**
于 2014-01-15T18:43:39.613 に答える