0

SQLクエリへのパラメータが動的になる状況があります。パラメータがnullの場合、クエリに追加したくありません。いくつかのことを試しました(機能したことはありません)..そして、今ではstoopidのように見えます

  ds = SqlHelper.ExecuteDataset(GlobalSettings.DbDSN, CommandType.Text, "SELECT TOP 1000 [ID],[Project],[Owner],[Consultant],[Contractor],[Value],[Level1],[Level2] ,[Status] ,[Category]  ,[Country],[CreatedDate],[CreatedByID],[CreatedByName] FROM [tbl_Projects] where"+if(!string.IsNullOrEmpty(paraCategory)){ "[Category] = @Category  and"}+"+ Country =@country and "+if(!string.IsNullOrEmpty(paraCategory)){ " value between @val1 and @val2"}+" order by CreatedDate asc",
                                     new SqlParameter("@Category", paraCategory),
                                      new SqlParameter("@Country", paraCountry),
                                       new SqlParameter("@val1", paraValue1),
                                                        new SqlParameter("@val2", paraValue2));

ここでも動的SQLの構築をチェック しましたが、キーワードのように配置する必要がある場所では役に立ちません..誰かがこれについて手を差し伸べることができますか?

4

4 に答える 4

1

SPを使用してこれを行うことができます

    CREATE  PROCEDURE MyDynamicSP(@Condition1 as varchar(100),Condition2 as varchar(100),Condition3 as varchar(100))
    AS
    SET NOCOUNT ON

    DECLARE @STRSQL VARCHAR(1000)

    SET @STRSQL = 'SELECT * FROM MyTable WHERE '
    IF NOT @Condition1 IS NULL
        @STRSQL = @STRSQL + ' ' + @Condition1

    IF NOT @Condition2 IS NULL
        @STRSQL = @STRSQL + ' ' + @Condition2

    IF NOT @Condition3 IS NULL
        @STRSQL = @STRSQL + ' ' + @Condition3

    EXEC sp_executesql @STRSQL

    SET NOCOUNT OFF
于 2013-07-26T11:41:50.960 に答える
1

アイデアを提供するために、私は次のようなことをします:

var sql as new StringBuilder();
sql.Append("SELECT ... all your columns ... FROM yourTable");
var parameters as new List(Of SqlParameter);
if (!string.IsNullOrEmpty(paraCategory)
{
  sql.Append("[Category]=@Category,");
  parameters.AddWithvalue("@Category", paraCategory);
}
sql.Length -= 1

//...your other parameters...

sql.Append("ORDER BY CreatedDate");

そして、それをすべて SqlHelper に渡します。

ds = SqlHelper.ExecuteDataset(GlobalSettings.DbDSN, CommandType.Text, sql.ToString(), parameters);

また、上記のコードは実際には防御的ではないことに注意してください。したがって、たとえば、パラメーターが配信されない場合、失敗します。また、SqlHelper-Class がわからないので、List(Of SqlParameter) 以外のものが必要になる場合があります。

于 2013-07-26T11:29:12.903 に答える