使用参数化查询发送空值

时间:2014-02-20 08:05:27

标签: 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为空怎么办?我怎么能这样做

4 个答案:

答案 0 :(得分:2)

基本上,您使用DBNull.Value

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

在TSQL中使用@PROFILE_ID,例如:

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);

答案 1 :(得分: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); 

答案 2 :(得分: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); 

答案 3 :(得分:0)

看看你的第一个例子,如果你的profileID变量为null,你就不需要构建一个参数了,只需编写一个不同的查询

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不为null,则搜索它,否则您将搜索StoreID,这就是全部。