高分求查询的一个思路

Shine_Moon 2007-09-10 02:25:20
在考虑如何做一个查询页面(Web)
当然上面有很多文本框,列表框,根据用户的输入决定查询的条件

现在的问题是
1.在cs文件中根据用户在某个控件的是否输入与选择来拼SQL语句好,还是索性把它们都仍到存储过程里,在存储过程里根据参数是否为null来拼接SQL语句好?理由?项目不大。

2.如果要用存储过程,为了让参数在存储过程里是null,是否必须在程序中赋值System.DBNull.Value

3.
if (txtStart.Text.Trim() == string.Empty)
cmd.Parameters.Add("@StartTime", SqlDbType.DateTime).Value = System.DBNull.Value;
else
cmd.Parameters.Add("@StartTime", SqlDbType.DateTime).Value = DateTime.Parse(txtStart.Text.Trim());

能否给个能通过的?:号表达式来完成,如果N个语句都这样些,实在太难看了

谢谢!
...全文
552 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
bb1210 2007-09-14
  • 打赏
  • 举报
回复
不管是拼接SQL语句还是在存储过程内拼接,都要防止SQL注入

参数都设为Varchar更好处理
ycxiangyun 2007-09-11
  • 打赏
  • 举报
回复
拼SQL语句肯定要好,写存储过程会让程序对数据库的依赖性太强,而且修改不方便
vvsamln 2007-09-11
  • 打赏
  • 举报
回复
up
waikey 2007-09-11
  • 打赏
  • 举报
回复
我认为在传参数时不用去判断吧,到过程里面去处理可能会好点吧,不然只会添加工作量而已吧
WangWei19871227 2007-09-11
  • 打赏
  • 举报
回复
我觉得 拼写sql查询的条件比较好
whoo529 2007-09-11
  • 打赏
  • 举报
回复
存储过程写好点,程序就简单多了

txtStart.Text.Trim() == string.Empty ?cmd.Parameters.Add("@StartTime", SqlDbType.DateTime).Value = System.DBNull.Value
: cmd.Parameters.Add("@StartTime", SqlDbType.DateTime).Value = DateTime.Parse(txtStart.Text.Trim())
bydxyj 2007-09-11
  • 打赏
  • 举报
回复
个人觉得拼接条件好一些!如楼上所说:逻辑清楚,修改方便
hy_lihuan 2007-09-11
  • 打赏
  • 举报
回复
肯定是拼接方便啊:
一、逻辑清楚
二、修改简单
chuxue1342 2007-09-11
  • 打赏
  • 举报
回复

3.
if (txtStart.Text.Trim() == string.Empty)
cmd.Parameters.Add("@StartTime", SqlDbType.DateTime).Value = System.DBNull.Value;
else
cmd.Parameters.Add("@StartTime", SqlDbType.DateTime).Value = DateTime.Parse(txtStart.Text.Trim());

能否给个能通过的?:号表达式来完成,如果N个语句都这样些,实在太难看了
----------------------------------------------------------------------------
试试
cmd.Parameters.Add("@StartTime", SqlDbType.DateTime).Value =txtStart.Text.Trim() == string.Empty?System.DBNull.Value:DateTime.Parse(txtStart.Text.Trim());
super_shu 2007-09-11
  • 打赏
  • 举报
回复
可以在每个条件的前面加个复选框,不过这你得先加个恒成立的条件比如1=1这样比较好判断的
photoplan 2007-09-11
  • 打赏
  • 举报
回复
写得有点急,存储过程里参数的前缀落下了,有点影响效果,凑合看吧
photoplan 2007-09-11
  • 打赏
  • 举报
回复
存储过程里这样写:
where (f1 = p1 or p1 is null)
and (f2 = p2 or p2 is null)
f 是字段,p是参数,这样可以写很长的条件而不显得乱。

传参时要给 DBNull.Value,
string.IsNullOrEmpty(str) ? DBNull.Value : str;

可以写一个实用工具类,封装个方法,签名如下:
object Uitl.GetDBValue(string)
实现起来很简单

绝代坏坏 2007-09-11
  • 打赏
  • 举报
回复
拼接sql语句没什么好办法
hanguoji84 2007-09-11
  • 打赏
  • 举报
回复
这种多条件查询的sql在存储过程中处理要好一些,因为可以随意改动不需要调整程序。并且存储过程是通过数据库服务器来调用速度比较快,给你个小例子可以参考:
CREATE PROCEDURE SendLog_GetAll
(
@LogType varchar(10),
@SendTimeStart varchar(50),
@SendTimeEnd varchar(50),
@SendState int
)
AS

declare @strsql varchar(3000) --临时sql语句
declare @StrSqlWhere varchar(1500) --临时sql的条件语句

set @StrSqlWhere = ''

if @LogType <> 'A'
BEGIN
set @StrSqlWhere = @StrSqlWhere + ' and SendLog.LogType = ''' + @LogType + ''''
END

if @SendTimeStart <> ''
BEGIN
set @StrSqlWhere = @StrSqlWhere + ' and CONVERT(varchar(10), SendLog.SendTime, 121) >= ''' + @SendTimeStart +''''
END

if @SendTimeEnd <> ''
BEGIN
set @StrSqlWhere = @StrSqlWhere + ' and CONVERT(varchar(10), SendLog.SendTime, 121) <= ''' + @SendTimeEnd + ''''
END

if @SendState <> -1
begin
set @StrSqlWhere = @StrSqlWhere + ' and '+ ' SendLog.State =' + CAST(@SendState AS varchar(12))
END

IF @StrSqlWhere <>''
BEGIN
SET @StrSqlWhere =' where ' + right(@StrSqlWhere, len(@StrSqlWhere)-4)
end
最后用你的 set @strsql = @strsql + @StrSqlWhere
然后exec(@strsql)
anncesky 2007-09-11
  • 打赏
  • 举报
回复
还是用存储过程的好
为梦去奋斗 2007-09-11
  • 打赏
  • 举报
回复
UP
bydwater 2007-09-11
  • 打赏
  • 举报
回复
拼SQL语句好
daishengs 2007-09-10
  • 打赏
  • 举报
回复
同意高歌
flyingfz 2007-09-10
  • 打赏
  • 举报
回复
mark
amandag 2007-09-10
  • 打赏
  • 举报
回复
和你的项目的形式统一,如果别的地方没有用存储过程,这里用就会很突兀,如果别的地方用了,这里当然用最好

个人推荐使用存储过程,传递空值进去也无妨,可以在存储过程里判断
加载更多回复(12)

62,074

社区成员

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

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

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

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