遇到多组合条件查询!在asp.net里建立多组合条件查询?请高人给个解答

ruan1978 2011-03-14 01:19:28
我的多组合条件查询是这样的:在页面上有7个输入框,这个输入条件,不一定全部输入,有可能输入其中一个或者两个,判断过程在存储过程里完成的.存储过程里是写的:
CREATE PROCEDURE sp_tbWasteSource_Search
(
@sd varchar, --开始日期
@ed varchar, --结束日期
@Unit varchar(50), --单位
@Name varchar(30), --核素
@Class varchar(5), --类别
@Area varchar(10), --地区
@PitNo varchar(4) --基坑
)
AS
Declare @sql Nvarchar(100)
Declare @sWhere Nvarchar(200)
Set @sql ='select * from tb_wasteSource where '
Set @sWhere =''
if (@sd is not null)
Begin
Set @sWhere=@sWhere+'StoreDate>='+@sd+' AND '
End
if (@ed is not null)
Begin
Set @sWhere=@sWhere+'StoreDate<='+@ed+' AND '
End
if(@Unit<>'')
Begin
Set @sWhere=@sWhere+'UseUnit='+@Unit+' AND '
End
if(@Name<>'')
Begin
Set @sWhere=@sWhere+'SName='+@Name+' AND '
End
if(@Class<>'')
Begin
Set @sWhere=@sWhere+'SClass='+@Class+' AND '
End
if(@Area<>'')
Begin
Set @sWhere=@sWhere+'FromRegion='+@Area+' AND '
End
if(@PitNo<>'')
Begin
Set @sWhere=@sWhere+'StorePitNo='+@PitNo
End
Set @sql=@sql+@sWhere
exec (@sql)
GO
我的页面的单击按钮代码里是这样写的,存储过程有错,不知道如何调试?
protected void ibtnSearch_Click(object sender, ImageClickEventArgs e)
{
string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_tbWasteSource_Search";
cmd.Parameters.Add(new SqlParameter("@sd",SqlDbType.VarChar,10));
cmd.Parameters.Add(new SqlParameter("@ed",SqlDbType.VarChar,10));
cmd.Parameters.Add(new SqlParameter("@Unit",SqlDbType.VarChar,50));
cmd.Parameters.Add(new SqlParameter("@Name",SqlDbType.VarChar,30));
cmd.Parameters.Add(new SqlParameter("@Class",SqlDbType.VarChar,5));
cmd.Parameters.Add(new SqlParameter("@Area",SqlDbType.VarChar,10));
cmd.Parameters.Add(new SqlParameter("@PitNo",SqlDbType.VarChar,4));
cmd.Parameters["@sd"].Value = this.txtFirstDate.Text == "" ? "": this.txtFirstDate.Text;
cmd.Parameters["@ed"].Value = this.txtLastDate.Text == "" ? "":this.txtLastDate.Text;
cmd.Parameters["@Unit"].Value = this.tbUnit.Text == "" ? "":this.tbUnit.Text;
cmd.Parameters["@Name"].Value = this.tbSourceName.Text == "" ? "":this.tbSourceName.Text;
cmd.Parameters["@Class"].Value = this.listClass.SelectedValue.ToString() == "" ? "":this.listClass.SelectedValue.ToString();
cmd.Parameters["@Area"].Value = this.listArea.SelectedValue.ToString() == "" ? "" : this.listArea.SelectedValue.ToString();
cmd.Parameters["@PitNo"].Value = this.listJK.SelectedValue.ToString() == "" ? "" : this.listJK.SelectedValue.ToString();
SqlDataReader dr = cmd.ExecuteReader();
this.gvFindData.DataSource = dr;
this.gvFindData.DataBind();
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
@sd varchar, --开始日期
@ed varchar, --结束日期
这两个设置日期类型可以吗?我现在在页面上某两个文本框里输入了条件之后,查不出结果?
...全文
277 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
各位请谁能给写一下查询功能啊?????
  • 打赏
  • 举报
回复
ruan1978 2011-03-15
  • 打赏
  • 举报
回复
tb_wasteSource表里的StoreDate字段是日期类型的,现在有这样一个情况,要把@sd,@ed参数转换成日期类型,因为我在页面上输入在文本框里是字符串.如果不输入,肯定是""空的,如果有输入,可以用DateTime.Parse()转换.现在调式,出现这样:
select * from tb_wasteSource where 1=1 and StoreDate>='''' and StoreDate<='''' and UseUnit='''' and SName='''' and SClass='''' and FromRegion='杭州' and StorePitNo=''''
从字符串转换为 datetime 时发生语法错误。
SN StoreNo UseUnit SName StoreDate DoseSurface Dose1M StorePitNo StoreShelfNo StoreBucketNo FactoryActivity SClass Application ToField StorePeriod Status wsImage docImage FromRegion Fees
------ -------- -------------------------------------------------- ------------------------------ --------- ----------- ------ ---------- -------------------- ------------- --------------- ------ -------------------------------------------------- ---------------------------------------- ----------- ------------ ------- -------- ---------- ------
没有行受影响。
(返回 0 行)
@RETURN_VALUE =
ruan1978 2011-03-15
  • 打赏
  • 举报
回复
谁发我一个调式工具?我就想看看,参数传进来,这个@sql到底是什么内容?我的QQ:837573389
chen_ya_ping 2011-03-15
  • 打赏
  • 举报
回复
自己可以先在数据库中对你的存储过程进行调试啊。调试准确了
yan267 2011-03-15
  • 打赏
  • 举报
回复

CREATE PROCEDURE sp_tbWasteSource_Search
(

Declare @sd VARCHAR(10), --开始日期
Declare @ed VARCHAR(10), --结束日期
Declare @Unit varchar(50), --单位
Declare @Name varchar(30), --核素
Declare @Class varchar(5), --类别
Declare @Area varchar(10), --地区
Declare @PitNo varchar(4) --基坑
)
--SET @sd='2011-03-15'
--SET @ed='2011-03-15'
--SET @Unit='qqqqq'
--SET @Name='fffff'
--SET @Class='dddd'
--SET @Area='gggggg'
--SET @PitNo='qwee'
Declare @sql Nvarchar(max)
Declare @sWhere Nvarchar(max)
Set @sql ='select * from tb_wasteSource where 1=1 '
Set @sWhere =''
if (@sd is not null)
Begin
Set @sWhere=@sWhere+' and StoreDate>='''+@sd+''''
End
if (@ed is not null)
Begin
Set @sWhere=@sWhere+' and StoreDate<='''+@ed+''''
End
if(@Unit<>'')
Begin
Set @sWhere=@sWhere+' and UseUnit='''+@Unit+''''
End
if(@Name<>'')
Begin
Set @sWhere=@sWhere+' and SName='''+@Name+''''
End
if(@Class<>'')
Begin
Set @sWhere=@sWhere+' and SClass='''+@Class+''''
End
if(@Area<>'')
Begin
Set @sWhere=@sWhere+' and FromRegion='''+@Area+''''
End
if(@PitNo<>'')
Begin
Set @sWhere=@sWhere+' and StorePitNo='''+@PitNo+''''
END

IF @sWhere=''
BEGIN
SET @sql=@sql+' and 1=1'
END
Set @sql=@sql+@sWhere
-------print (@sql)
EXEC(@sql)



晕倒。我以为你只是and放多了。谁知道很多细节你都搞错了。

@sd varchar, --开始日期------只有一个字符
Declare @sql Nvarchar(100)--------你拼起来的SQL远远超过这个长度
Declare @sWhere Nvarchar(200)-------同上

o(︶︿︶)o 唉。你要print打印出SQL出来看看先,再运行。

ruan1978 2011-03-14
  • 打赏
  • 举报
回复
楼上的指点了,但是我已经写入了你的存储过程,但是结果还是:
在关键字 'and' 附近有语法错误。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 在关键字 'and' 附近有语法错误。

源错误:


行 297: cmd.Parameters["@Area"].Value = this.listArea.SelectedValue.ToString() == "" ? "" : this.listArea.SelectedValue.ToString();
行 298: cmd.Parameters["@PitNo"].Value = this.listJK.SelectedValue.ToString() == "" ? "" : this.listJK.SelectedValue.ToString();
行 299: SqlDataReader dr = cmd.ExecuteReader();
行 300: this.gvFindData.DataSource = dr;
行 301: this.gvFindData.DataBind();

yan267 2011-03-14
  • 打赏
  • 举报
回复

CREATE PROCEDURE sp_tbWasteSource_Search
(
@sd varchar, --开始日期
@ed varchar, --结束日期
@Unit varchar(50), --单位
@Name varchar(30), --核素
@Class varchar(5), --类别
@Area varchar(10), --地区
@PitNo varchar(4) --基坑
)
AS
Declare @sql Nvarchar(100)
Declare @sWhere Nvarchar(200)
Set @sql ='select * from tb_wasteSource where 1=1 '
Set @sWhere =''
if (@sd is not null)
Begin
Set @sWhere=@sWhere+' and StoreDate>='+@sd
End
if (@ed is not null)
Begin
Set @sWhere=@sWhere+' and StoreDate<='+@ed
End
if(@Unit<>'')
Begin
Set @sWhere=@sWhere+' and UseUnit='+@Unit
End
if(@Name<>'')
Begin
Set @sWhere=@sWhere+'and SName='+@Name
End
if(@Class<>'')
Begin
Set @sWhere=@sWhere+' and SClass='+@Class
End
if(@Area<>'')
Begin
Set @sWhere=@sWhere+'and FromRegion='+@Area
End
if(@PitNo<>'')
Begin
Set @sWhere=@sWhere+' and StorePitNo='+@PitNo
END


IF @sWhere=''
BEGIN
SET @sql=@sql+' and 1=1'
END
Set @sql=@sql+@sWhere
exec (@sql)
GO

NextMoon 2011-03-14
  • 打赏
  • 举报
回复
检查一下好象还有语法错误!
ruan1978 2011-03-14
  • 打赏
  • 举报
回复
我查过了,如果是where后跟上1=1,查不出任何结果,但是我记录里有内容的.肯定有满足条件的记录
ruan1978 2011-03-14
  • 打赏
  • 举报
回复
楼上的单引号,都没有完全结束,有错误.
explife 2011-03-14
  • 打赏
  • 举报
回复
CREATE PROCEDURE sp_tbWasteSource_Search
(
@sd varchar, --开始日期
@ed varchar, --结束日期
@Unit varchar(50), --单位
@Name varchar(30), --核素
@Class varchar(5), --类别
@Area varchar(10), --地区
@PitNo varchar(4) --基坑
)
AS
Declare @sql Nvarchar(100)
Declare @sWhere Nvarchar(200)
Set @sql ='select * from tb_wasteSource where '
Set @sWhere =' 1 = 1'
if (@sd is not null)
Begin
Set @sWhere=@sWhere+' and StoreDate>='''+@sd+'''
End
if (@ed is not null)
Begin
Set @sWhere=@sWhere+' and StoreDate<='''+@ed+'''
End
if(@Unit<>'')
Begin
Set @sWhere=@sWhere+' and UseUnit='''+@Unit+'''
End
if(@Name<>'')
Begin
Set @sWhere=@sWhere+' and SName='''+@Name+'''
End
if(@Class<>'')
Begin
Set @sWhere=@sWhere+' and SClass='''+@Class+'''
End
if(@Area<>'')
Begin
Set @sWhere=@sWhere+' and FromRegion='''+@Area+'''
End
if(@PitNo<>'')
Begin
Set @sWhere=@sWhere+' and StorePitNo='''+@PitNo+'''
End
Set @sql=@sql+@sWhere
exec (@sql)
GO
我的页面的单击按钮代码里是这样写的,存储过程有错,不知道如何调试?
protected void ibtnSearch_Click(object sender, ImageClickEventArgs e)
{
string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_tbWasteSource_Search";
cmd.Parameters.Add(new SqlParameter("@sd",SqlDbType.VarChar,10));
cmd.Parameters.Add(new SqlParameter("@ed",SqlDbType.VarChar,10));
cmd.Parameters.Add(new SqlParameter("@Unit",SqlDbType.VarChar,50));
cmd.Parameters.Add(new SqlParameter("@Name",SqlDbType.VarChar,30));
cmd.Parameters.Add(new SqlParameter("@Class",SqlDbType.VarChar,5));
cmd.Parameters.Add(new SqlParameter("@Area",SqlDbType.VarChar,10));
cmd.Parameters.Add(new SqlParameter("@PitNo",SqlDbType.VarChar,4));
cmd.Parameters["@sd"].Value = this.txtFirstDate.Text == "" ? "": this.txtFirstDate.Text;
cmd.Parameters["@ed"].Value = this.txtLastDate.Text == "" ? "":this.txtLastDate.Text;
cmd.Parameters["@Unit"].Value = this.tbUnit.Text == "" ? "":this.tbUnit.Text;
cmd.Parameters["@Name"].Value = this.tbSourceName.Text == "" ? "":this.tbSourceName.Text;
cmd.Parameters["@Class"].Value = this.listClass.SelectedValue.ToString() == "" ? "":this.listClass.SelectedValue.ToString();
cmd.Parameters["@Area"].Value = this.listArea.SelectedValue.ToString() == "" ? "" : this.listArea.SelectedValue.ToString();
cmd.Parameters["@PitNo"].Value = this.listJK.SelectedValue.ToString() == "" ? "" : this.listJK.SelectedValue.ToString();
SqlDataReader dr = cmd.ExecuteReader();
this.gvFindData.DataSource = dr;
this.gvFindData.DataBind();
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
ruan1978 2011-03-14
  • 打赏
  • 举报
回复
我在.net2008里调式存储过程,提示,是不是把参数@sd,@ed设置成varchar类型不对.提示是这样的
没有行受影响。
(返回 0 行)
没有行受影响。
(返回 0 行)
正在运行 [dbo].[sp_tbWasteSource_Search] ( @sd = '', @ed = '', @Unit = '', @Name = '', @Class = '', @Area = 杭州, @PitNo = '' ).

从字符串转换为 datetime 时发生语法错误。
SN StoreNo UseUnit SName StoreDate DoseSurface Dose1M StorePitNo StoreShelfNo StoreBucketNo FactoryActivity SClass Application ToField StorePeriod Status wsImage docImage FromRegion Fees
------ -------- -------------------------------------------------- ------------------------------ --------- ----------- ------ ---------- -------------------- ------------- --------------- ------ -------------------------------------------------- ---------------------------------------- ----------- ------------ ------- -------- ---------- ------
没有行受影响。
(返回 0 行)
@RETURN_VALUE =
完成 [dbo].[sp_tbWasteSource_Search] 运行。
程序“SQL 调试器: T-SQL”已退出,返回值为 0 (0x0)。
我在存储过程里已经加了1=1了.
tomscat 2011-03-14
  • 打赏
  • 举报
回复
最开始的时候where 1=1,然后就不会错了
ruan1978 2011-03-14
  • 打赏
  • 举报
回复
存储过程,改成楼上所说的,还是这个错误.
在关键字 'AND' 附近有语法错误。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 在关键字 'AND' 附近有语法错误。

源错误:


行 297: cmd.Parameters["@Area"].Value = this.listArea.SelectedValue.ToString() == "" ? "" : this.listArea.SelectedValue.ToString();
行 298: cmd.Parameters["@PitNo"].Value = this.listJK.SelectedValue.ToString() == "" ? "" : this.listJK.SelectedValue.ToString();
行 299: SqlDataReader dr = cmd.ExecuteReader();
行 300: this.gvFindData.DataSource = dr;


AstaChen 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jinkuang45 的回复:]
cmd.Parameters["@sd"].Value = this.txtFirstDate.Text == "" ? null: this.txtFirstDate.Text;
cmd.Parameters["@ed"].Value = this.txtLastDate.Text == "" ? null:this.txtLastDate.Text;
[/Quote]

+1

@PitNo为空时会出错吧。。
1:把Set @sql ='select * from tb_wasteSource where ' 改为Set @sql ='select * from tb_wasteSource where 1=1'

2:把组合的sql的and放到前面去,如Set @sWhere=@sWhere+'UseUnit='+@Unit+' AND '改为Set @sWhere=@sWhere+' and UseUnit='+@Unit
子夜__ 2011-03-14
  • 打赏
  • 举报
回复
varchar(20)


this.txtFirstDate.Text == "" ? null

为null吧

你传的值在存储过程能够正确判断就好了。
冰川711 2011-03-14
  • 打赏
  • 举报
回复
cmd.Parameters["@sd"].Value = this.txtFirstDate.Text == "" ? null: this.txtFirstDate.Text;
cmd.Parameters["@ed"].Value = this.txtLastDate.Text == "" ? null:this.txtLastDate.Text;

62,046

社区成员

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

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

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

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