c# - 使用参数化查询发送空值

标签 c# sql

 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/

相关文章:

C# - 在另一个字符串中查找一组字符串中的一个的最快方法

c# - .Net 4 - 在程序集中包含自定义信息

c# - 在 C# 中将结构体指针作为参数传递

sql - Mysql 语句不适用于多个 AND 子句

使用两个日期的 SQL 查询

mysql - 仅当存在外键时才删除它

c# - DateTime as empty String or null ?如何检查?

Javascript 验证在 C# 中不起作用(错误消息)

mysql - WHERE 子句或 ON 子句中的 INNER JOIN 条件?

sql - 如何使用 SQL Server 批量更新?