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 :(得分: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,这就是全部。