2014-02-20 67 views
2
public static DataTable GetBatches(long storeID, long? ProfileID) 
{ 
    string query = 
    "SELECT .... where " + (ProfileID.HasValue ? "PROFILE_ID=" + ProfileID.Value : "STORE_ID=" + storeID); 

我想改变这种状况查询接受这样的参数化值:发送空值与参数化查询

List<SqlParameter> params_list = new List<SqlParameter>(); 
    SqlParameter param_ProfileID = new SqlParameter("@PROFILE_ID", ProfileID); 
    param_StoreID.SourceColumn = "PROFILE_ID"; 
    param_StoreID.DbType = DbType.Int64; 
    params_list.Add(param_ProfileID); 

但如果Profile_id为空呢?我怎么能做到这一点

+0

您是否想要检索PROFILE_ID中具有NULL值的行以及具有相关ID的行,或者是否希望能够为参数提供NULL值并在此情况下检索所有行或仅检索那些有Profile_Id = NULL的人? – Markus

+0

如果我理解正确,你的第一个例子,如果ProfileID为空,你将WHERE条件改为使用STORE_ID,因此你不再使用字段PROFILE_ID,也不需要为它建立一个参数 – Steve

回答

2

,您使用DBNull.Value

SqlParameter param_ProfileID = new SqlParameter("ProfileID", 
    (object)ProfileID ?? DBNull.Value); 

而在TSQL使用@PROFILE_ID,例如:

where table.ProfileID = @ProfileID 

或者,使用像短小精悍的帮手工具,并忘记它:

return connection.Query<SomeType>(
    "select * from SomeTable where ProfileID = @ProfileID", 
    new { ProfileID }).ToList(); 

(它返回List<SomeType>,而不是一个DataTable


重新条件搜索,这里还有各种方法;一个是次优:

where (@Foo is null or table.Foo = @Foo) 
and (@Bar is null or table.Bar = @Bar) 

提供时,它匹配@Foo,当它提供@Bar - 但...这不是很大的打击指标,特别是如果你添加更多的条款。在你的情况下,我会试图做:

var sql = ProfileID == null 
    ? "select * from Blah where StoreID = @StoreID" 
    : "select * from Blah where StoreID = @StoreID and ProfileID = @ProfileID"; 

它使用最佳TSQL为2场景。如果您提供的命令未使用的参数也不要紧,但你也可以这样做:

cmd.Parameters.AddWithValue("StoreID", StoreID); 
if(ProfileID != null) cmd.Parameters.AddWithValue("ProfileID", ProfileID); 
+0

不,我需要返回一个dataTable我这样做: 'SqlParameter param_ProfileID = new SqlParameter(“@ PROFILE_ID”,(object)ProfileID ?? DBNull.Value); params_list.Add(param_StoreID);' 和查询是这样的:“其中PROFILE_ID = @ PROFILE_ID和STORE_ID = @ STORE_ID”; 现在我的问题是否@Profile_id为空会查询返回异常? – Sora

+0

@Sora不会引发异常,但在ANSI sql中,没有任何** eever **等于'null'(甚至不是'null') - 所以您需要TSQL来适应。我将编辑来演示。 –

+0

谢谢@Marc这个精彩的答案 – Sora

0

你基本上可以使用此解决

List<SqlParameter> params_list = new List<SqlParameter>(); 
if(ProfileID==null) 
{ 
    SqlParameter param_ProfileID = new SqlParameter("@PROFILE_ID", DBNull.Value); 
} 
else 
{ 
    SqlParameter param_ProfileID = new SqlParameter("@PROFILE_ID", ProfileID); 
} 
param_StoreID.SourceColumn = "PROFILE_ID"; 
param_StoreID.DbType = DbType.Int64; 
params_list.Add(param_ProfileID); 
+1

以及查询看起来像 ? – Sora

0

基于您的意见,查询应该是这样的:

SELECT * FFROM tbl WHERE (@Profile_Id = NULL AND Store_Id = @Store_Id) 
    OR (@Profile_Id <> NULL AND Profile_Id = @Profile_Id) 

您可以设置像这样的参数:

List<SqlParameter> params_list = new List<SqlParameter>(); 
SqlParameter param_ProfileID = new SqlParameter("@PROFILE_ID", (object)ProfileID ?? DBNull.Value); 
param_StoreID.SourceColumn = "PROFILE_ID"; 
params_list.Add(param_ProfileID); 
SqlParameter param_StoreID = new SqlParameter("@STORE_ID", StoreId); 
param_StoreID.SourceColumn = "STORE_ID"; 
params_list.Add(param_StoreID); 
0

看你的第一个例子,它似乎很清楚,你不需要建立一个参数,如果您的配置文件ID变量为空,只需编写不同的查询

public static DataTable GetBatches(long storeID, long? ProfileID) 
{ 
    List<SqlParameter> pList = new List<SqlParameter>(); 
    string query = "SELECT .... where "; 
    if(ProfileID.HasValue) 
    { 
     query += "PROFILE_ID= @proID"; 
     SqlParameter pProfileID = new SqlParameter("@proID", SqlDbType.BigInt) 
             .Value = ProfileID.Value; 
     pList.Add(pProfileID); 
    } 
    else 
    { 
     query += "STORE_ID= @stoID"; 
     SqlParameter pStoreID = new SqlParameter("@stoID", SqlDbType.BigInt) 
             .Value = storeID; 
     pList.Add(pStoreID); 
    } 

如果ProfileID不为空,则搜索它,否则您搜索StoreID即可。

+0

是的,这是一个快速写错误是的,如果配置文件ID不为空我搜索配置文件ID否则storeid – Sora