参数化查询,动态创建参数

woshimaikou 2011-04-20 09:50:45
做查询时遇到这样一个问题,Sql语句是根据条件拼接的(代码如下);那我的相应的OleDbParameter如何才能根据条件只创建相应的参数。开始我放在了每个if里但数组没有动态添加元素的功能,又用了ArrayList,但我的SQLhelper接受的参数是params OleDbParameter[]
现在不想改动SQLhelper,如何才能做到??


StringBuilder sql = new StringBuilder();
sql.Append("select * from SellData where isDel=@isDel ");
if (model.BigClassID != 0)
sql.Append("and bigClass=@bigClass ");
if (model.SmallClassID != 0)
sql.Append("and smallClass=@smallClass ");
if (model.ShopID != 0)
sql.Append("and shopID=@shopID ");
if (model.StartTime != DateTime.MinValue && model.EndTime != DateTime.MaxValue)
sql.Append("and sellDate between @startTime and @endTime ");
sql.Append("order by id desc");


OleDbParameter[] op = new OleDbParameter[]{
new OleDbParameter("@bigClass",OleDbType.Integer,20),
new OleDbParameter("@smallClass",OleDbType.Integer,20),
new OleDbParameter("@shopID",OleDbType.Integer,20),
new OleDbParameter("@startTime",OleDbType.DBDate,20),
new OleDbParameter("@endTime",OleDbType.DBDate,20),
new OleDbParameter("@isDel",OleDbType.Integer,10)
};

op[0].Value = model.BigClassID;
op[1].Value = model.SmallClassID;
op[2].Value = model.ShopID;
op[3].Value = model.StartTime;
op[4].Value = model.EndTime;
op[5].Value = model.IsDel;

...全文
103 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzf86211861 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zx75991 的回复:]

引用 6 楼 wxr0323 的回复:
引用 5 楼 telankes2000 的回复:

C# code


System.Text.StringBuilder sql = new System.Text.StringBuilder();
System.Collections.Hashtable list = new Hashtable();
sql.Append("selec……
[/Quote]
学习下
天下在我心 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wxr0323 的回复:]
引用 5 楼 telankes2000 的回复:

C# code


System.Text.StringBuilder sql = new System.Text.StringBuilder();
System.Collections.Hashtable list = new Hashtable();
sql.Append("select * from SellData wher……
[/Quote]
这个方法可行
telankes2000 2011-04-20
  • 打赏
  • 举报
回复


System.Text.StringBuilder sql = new System.Text.StringBuilder();
System.Collections.Hashtable list = new Hashtable();
sql.Append("select * from SellData where isDel=@isDel ");
OleDbParameter IsDel = new OleDbParameter("@IsDel", OleDbType.Integer, 20);
IsDel.Value = model.IsDel;
list.Add("IsDel", IsDel);
if (model.BigClassID != 0) {
OleDbParameter BigClassID = new OleDbParameter("@bigClass", OleDbType.Integer, 20);
BigClassID.Value = model.BigClassID;
list.Add("BigClassID", BigClassID);
sql.Append("and bigClass=@bigClass ");
}
if (model.SmallClassID != 0) {
OleDbParameter SmallClassID = new OleDbParameter("@smallClass", OleDbType.Integer, 20);
SmallClassID.Value = model.SmallClassID;
list.Add("SmallClassID", SmallClassID);
sql.Append("and smallClass=@smallClass ");
}
if (model.ShopID != 0) {
OleDbParameter ShopID = new OleDbParameter("@shopID", OleDbType.Integer, 20);
ShopID.Value = model.ShopID;
list.Add("ShopID", ShopID);
sql.Append("and shopID=@shopID ");
}
if (model.StartTime != DateTime.MinValue && model.EndTime != DateTime.MaxValue) {
OleDbParameter StartTime = new OleDbParameter("@startTime", OleDbType.Integer, 20);
StartTime.Value = model.StartTime;
list.Add("StartTime", StartTime);
OleDbParameter EndTime = new OleDbParameter("@EndTime", OleDbType.Integer, 20);
EndTime.Value = model.EndTime;
list.Add("EndTime", EndTime);
sql.Append("and sellDate between @startTime and @endTime ");
}
sql.Append("order by id desc");
OleDbParameter[] op = new OleDbParameter[list.Count];
int index = 0;
foreach (System.Collections.DictionaryEntry entry in list) {
op[index] = (OleDbParameter)entry.Value;
index++;
}
子夜__ 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 telankes2000 的回复:]

C# code


System.Text.StringBuilder sql = new System.Text.StringBuilder();
System.Collections.Hashtable list = new Hashtable();
sql.Append("select * from SellData where isDel……
[/Quote]
在IF判断的时候 可以声明一个list<string> 来存是否使用了该参数、、

参数添加的时候 在把list<string> 取出来。然后遍历添加参数
Rock870210 2011-04-20
  • 打赏
  • 举报
回复
List<OleDbParameter> list = new List<OleDbParameter>();
if (model.BigClassID != 0)
{
sql.Append("and bigClass=@bigClass ");
OleDbParameter param = new OleDbParameter("@bigClass",OleDbType.Integer,20);
param.Value = model.BigClassID;
list.Add(param);
}
。。。。
接下来就不用说了吧!!!
_程序员 2011-04-20
  • 打赏
  • 举报
回复
查寻字符串都被你写死了,还怎么改
woshimaikou 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zq32206124 的回复:]
C# code

StringBuilder sql = new StringBuilder();
sql.Append("select * from SellData where isDel=@isDel ");
if (model.BigClassID != 0)
sql.Append("and bigClass='"+model.BigClassID +"' ");
……
[/Quote]
我不想放弃参数化 呵呵
zq32206124 2011-04-20
  • 打赏
  • 举报
回复

StringBuilder sql = new StringBuilder();
sql.Append("select * from SellData where isDel=@isDel ");
if (model.BigClassID != 0)
sql.Append("and bigClass='"+model.BigClassID +"' ");
if (model.SmallClassID != 0)
sql.Append("and smallClass=@'"+model.SmallClassID +"'");
if (model.ShopID != 0)
sql.Append("and shopID='"+model.ShopID +"'");
if (model.StartTime != DateTime.MinValue && model.EndTime != DateTime.MaxValue)
sql.Append("and sellDate between '"+model.StartTime +"' and '"+model.EndTime+"'");
sql.Append("order by id desc");

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧