版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaofen_7/article/details/82791904
敲机房中看着同期的人的博客,学习存储过程的使用,在查询记录和金额查询这里,拥有共同的窗体,所以自己就使用了模板方法+存储过程!查询日期的过程让我遇到了问题。
在实体中声明了3个字段,分别是数据表,起始日期,终止日期
然后把dateTimepicker控件中的值分别给字段,数据表的值【通过重写模板类中的虚方法得到】
//实体层赋值
//-----------选择数据表
queryCash.Tablename = GetDbTableName();
//-----------选择字段
//dateTimePicker1.CustomFormat = "yyyy-MM-dd";
//dateTimePicker2.CustomFormat = "yyyy-MM-dd";
string[] date1 = dateTimePicker1.Value.ToString("yyyy-MM-dd").Split(' ');
string[] date2 = dateTimePicker2.Value.ToString("yyyy-MM-dd").Split(' ');
queryCash.Cmdfiled1 = date1[0];
queryCash.Cmdfiled2 = date2[0];
在这里,dateTimepicker获得的日期默认的格式:yyyy-MM-dd hh:mm:ss.000
这个时候需要先将日期类型转换为字符串类型,然后截取字符串获得日期就可以了,不能使用CustomFormat,这个只是显示日期类型,并没有将值转换为字符串!
通过中间的传递,到D层的时候
namespace DAL
{
class QueryCashTemplateDAL : IDAL.QueryCashTemplate
{
public DataTable queryCash(QueryCash queryCash)
{
SqlHelper sqlHelper = new SqlHelper();
SqlParameter[] sqlParams = {
new SqlParameter("@cmdfiled1",queryCash.Cmdfiled1),
new SqlParameter("@cmdfiled2",queryCash.Cmdfiled2),
new SqlParameter("@tablename", queryCash.Tablename)
};
string sql = "PROC_CheckCashDouble";
DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.StoredProcedure);
return table;
}
}
}
D层调用存储过程
一开始写的存储过程中最关键的的语句是这样的,我以为它执行的时候,会将表名,两个日期以字符串的格式传过来,这样运行整个sql语句【本质是字符串】就可以了。
我以为的过程:
但实际数据库里的执行:
但后来执行,明明数据库里是有记录的,但查询不出来,原因是sql语句在执行的时候,将两个字符串类型的日期当做日期类型识别处理,用日期类型的值和数据库里字符串类型的值做匹配,当然不成功,所以查不出来!
USE [ChargeSystem]
GO
/****** Object: StoredProcedure [dbo].[PROC_CheckCashDouble] Script Date: 2018/9/20 19:00:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:赵芬
-- Create date: 2018-9-18
-- Description: 用于查询(收取和返回)金额时和数据库交互
-- =============================================
ALTER PROCEDURE [dbo].[PROC_CheckCashDouble]
/***需要传递的参数**/
@cmdfiled1 varchar(50),
@cmdfiled2 varchar(50),
@tablename varchar(50)
AS
declare @TempSql varchar(500)
BEGIN
SET @TempSql= 'select * from '+@tablename+' where DateTime between '+@cmdfiled1+' and '+@cmdfiled2
execute(@TempSql)
end
后来,我就想如果能将穿过来的参数加工一下,让数据库只能把它当做字符串处理就可以了,所以,我就想在这两个字符串类型的日期两遍分别加上单引号,这样就绝对不会出问题了,所以就大胆做了尝试!
ALTER PROCEDURE [dbo].[PROC_CheckCashDouble]
/***需要传递的参数**/
@cmdfiled1 varchar(50),
@cmdfiled2 varchar(50),
@tablename varchar(50)
AS
declare @TempSql varchar(500)
declare @smb char(2)
BEGIN
Set @smb =''''
set @cmdfiled1 =@smb+@cmdfiled1+@smb
set @cmdfiled2 =@smb+@cmdfiled2+@smb
SET @TempSql= 'select * from '+@tablename+' where DateTime between '+@cmdfiled1+' and '+@cmdfiled2
print @TempSql
execute(@TempSql)
end
最终的结果:
在声明单引号时:注意
Set @smb ='''
--不能这样写,或许你会说,字符串不是要用单引号括起来吗?前后各需要一个单引号就可以,为什么要加两个
--答:
---:1.就近匹配,这样想会认为前两个单引号刚好一对,多出来的单引号就会报错
---:2.所以没有办法只加一个单引号
---:3.所以,我就用前后放了一对单引号
---:4.这样,内层的两个单引号将值转换为字符型
---:5.外层,外层用来标识里面的内容为字符串