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
为 null 该怎么办?我该怎么做
最佳答案
基本上,您使用 DBNull.Value
:
SqlParameter param_ProfileID = new SqlParameter("ProfileID",
(object)ProfileID ?? DBNull.Value);
并使用@PROFILE_ID
在TSQL中,例如:
where table.ProfileID = @ProfileID
或者,使用像 dapper 这样的辅助工具,然后忘记它:
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。如果您在命令中提供未使用的参数并不重要,但您也可以这样做:
cmd.Parameters.AddWithValue("StoreID", StoreID);
if(ProfileID != null) cmd.Parameters.AddWithValue("ProfileID", ProfileID);
关于c# - 使用参数化查询发送空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21901712/