2

私は次のコードを持っています:

ご覧のとおり、Field2にパラメーターを渡す必要がありますが、「すべての値」オプションを処理するには、そのパラメーターもabloである必要があります。たとえば、パラメーターに「foo」を割り当てると、クエリはField2 = "foo" ...であるすべてのレコードですが、ワイルドカード、または結果としてすべての値を与えるようにそのパラメーターに指示する何かを渡すこともできるようにしたいです。

MyDataset dataset = new MyDataset();
SqlConnection objConnection = new SqlConnection(_connectionstring);
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.Connection = objConnection;
objDataAdapter.SelectCommand.CommandText =
"SELECT Field1, Field2, Field3 FROM Table WHERE (Field2 = @Field2)";
objDataAdapter.SelectCommand.CommandType = CommandType.Text;
objDataAdapter.SelectCommand.Parameters.AddWithValue("@Field2", txtBoxField2.Text);
objDataAdapter.Fill(dataset.Table);
this.DataContext = dataset.Table.DefaultView;

前もって感謝します。

4

3 に答える 3

3

これを行う 1 つの方法は、null 許容パラメーターを使用することです。

SELECT Field1, Field2, Field3 
FROM Table 
WHERE (@Field2 IS NULL OR Field2 = @Field2)

ただし、多くのパラメーターがある状況では、これにより、クエリ プランが正しくキャッシュされない可能性があることに注意する必要があります。SQL Server 2005 以降を使用している場合、これはOPTIMIZE FORを使用して大幅に軽減できます。

また、統計が最新であることを確認してください。

于 2010-02-25T10:04:32.190 に答える
1

C# コード内でそのような SQL を構築している場合は、C# ロジックに if 条件を追加して、すべてのレコードを返すインスタンスに WHERE 句を含めないようにします。これにより、別の SQL ステートメントが作成されるため、パフォーマンス/実行計画に関しては問題ありません。

sproc を使用する場合は、次のアプローチを試すことができます。

IF (@Field2 = 'SomeWildcardValue')
    SELECT Field1, Field2, Field3 FROM SomeTable
ELSE
    SELECT Field1, Field2, Field3 FROM SomeTable WHERE Field2 = @Field2

または、それらを完全に分離して、ALL を返す 1 つの sproc と、Field2 検索に基づいて返す 1 つの sproc を作成します。ただし、パラメーターの数が多い場合、これはすぐに増加する可能性があります。

于 2010-02-25T10:08:26.707 に答える
0

一般に、SP では nullable パラメータ メソッドを使用します。ただし、コードに基づいて、ユーザーが入力した内容に基づいて SQL コマンドテキストを作成してみませんか? たとえば、ユーザーがテキスト ボックスに何かを入力した場合にのみ SQL に where 句を追加し、それ以外の場合は単純な選択を追加します。

于 2010-02-25T11:33:58.530 に答える