解決:sql中將日期字串當做日期型別處理
阿新 • • 發佈:2018-12-11
敲機房中看著同期的人的部落格,學習儲存過程的使用,在查詢記錄和金額查詢這裡,擁有共同的窗體,所以自己就使用了模板方法+儲存過程!查詢日期的過程讓我遇到了問題。
在實體中聲明瞭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 ' [email protected]+' where DateTime between '[email protected]+' and '[email protected]
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 [email protected][email protected][email protected]
set @cmdfiled2 [email protected][email protected][email protected]
SET @TempSql= 'select * from '[email protected]+' where DateTime between '[email protected]+' and '[email protected]
print @TempSql
execute(@TempSql)
end
最終的結果:
在宣告單引號時:注意
Set @smb ='''
--不能這樣寫,或許你會說,字串不是要用單引號括起來嗎?前後各需要一個單引號就可以,為什麼要加兩個
--答:
---:1.就近匹配,這樣想會認為前兩個單引號剛好一對,多出來的單引號就會報錯
---:2.所以沒有辦法只加一個單引號
---:3.所以,我就用前後放了一對單引號
---:4.這樣,內層的兩個單引號將值轉換為字元型
---:5.外層,外層用來標識裡面的內容為字串