积极答复者
Date类型空值写法新问题!

问题
-
以前我是这样达到时间空值效果的:
1.先把SqlDataSource中的Date类型数据如Time1,使用Control关联到TextBox1;
2.设置该Control到TextBox1的缺省值为1999-01-01
3.SelectCommand语句:select * from Table1 where (ISNULL(Time1,N'')='1999-01-01' or Time=@Time)
-----------------------------问题来了。。。------------------------
一般情况下这样可以达到TextBox1没写入日期时也能提取数据,貌似很正常,但还有一种特殊情况会导致数据遗漏。
当数据库中某一行的Time为Null时,“SelectCommand语句:select * from Table1 where (ISNULL(@Time1,N'')='1999-01-01' or Time=@Time) ” 找不到该数据!请问应该怎么写呢?
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
答案
-
可能是我在一楼的帖子说的不够清楚!并不是TextBox输入条件为空的时候有问题,而是在数据库中某些行的LeaseDateTo列本来就是空值,这些行就算你设置了ISNULL(@LeaseDateTo, '') = '',它也不会显示。
我实例测试了:如果不加上'or LeaseDateTo is Null',界面一打开的时候确实显示了所有数据,一旦在TextBox中输入了时间,那么会显示数据库中LeaseDateTo非空的行,而LeaseDateTo为Null的行不会显示。
只有在Where条件中加入'or LeaseDateTo is Null' 才能完整显示!
您可以在数据库中编个没有LeaseDateTo的记录试试!我也是偶然发现这种容易被忽略的情况的!
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
如果您的需求為輸入TextBox時,連帶Null的數據也要撈出來的話,確實就要加上or LeaseDateTo is Null 了
Shadowと愉快なコード達- 已标记为答案 linjiangxian11 2011年8月27日 15:44
全部回复
-
3.SelectCommand语句:select * from Table1 where (ISNULL(Time1,N'')='1999-01-01' or Time=@Time)
我没有看懂你这句话是什么意思——或许你应该告诉我们:你究竟要达到什么目的?筛选出日期=1999-01-01的所有数据?
还有,你的IsNull用法似乎也不对,应该是:
IsNull(Time1,'1999-01-01'),这样,一旦日期是Null,就会用1999-01-01来替代。而且这个语句应该放到select这里。
请务必说清楚你究竟打到什么目的?
果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者
If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
下载MSDN桌面工具(Vista,Win7)
下载Technet桌面小工具(Vista,Win7)
慈善点击,点击此处 -
select * from Table1 where (ISNULL(Time1,N'')='1999-01-01' or Time=@Time)
就是字段Time1为空或等于变量@Time1时条件成立,而实际上如果数据库中有一行,它的Time1值为空,却不能选择到这一行!
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把! -
select * from Table1 where (ISNULL(Time1,N'')='1999-01-01' or Time=@Time
請改用
select * from Table1 where (ISNULL(Time1,N'1999-01-01')='1999-01-01' or Time=@Time
試試看
原本您的寫法若Time1為空時,''和'1999-01-01'兩個不會相等,當然就撈不到數據
Shadowと愉快なコード達
-
那么可以这样写么?
select * from Table1 where (ISNULL(Time1,N'')='' or Time=@Time
然后把Control关联的缺省值不写(我以前是写了1999-01-01)
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把! -
那么可以这样写么?
select * from Table1 where (ISNULL(Time1,N'')='' or Time=@Time
然后把Control关联的缺省值不写(我以前是写了1999-01-01)
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
可以,不過最好統一一下,把N拿掉select * from Table1 where (ISNULL(Time1,'')='' or Time=@Time
Shadowと愉快なコード達
-
SELECT ContractNumber, City, Road, Address, LeaseDateFrom, LeaseDateTo FROM ContractTable WHERE (ISNULL(@LeaseDateTo, '') = '') OR (LeaseDateTo >= @LeaseDateTo)
上面这个SQL语句我按照您的提示写的,界面一打开的时候是空白,必须在TextBox1中输入一个条件才能显示数据,并不能达到一打开界面就显示全部数据的效果!
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把! -
-
======================前台=====================
我测试过要输入条件才可以显示数据!!!那个LeaseDateTo是合同终止时间,这个界面是查询 TextBox1的时间和Textbox2的时间之间到期的合同
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default12.aspx.cs" Inherits="Default12" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <style type="text/css"> .style1 { width: 100%; } </style> </head> <body> <form id="form1" runat="server"> <div> <table cellpadding="0" cellspacing="0" class="style1"> <tr> <td> <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True"></asp:TextBox> <asp:TextBox ID="TextBox2" runat="server" AutoPostBack="True"></asp:TextBox> </td> </tr> <tr> <td> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ContractNumber" DataSourceID="SqlDataSource1"> <Columns> <asp:BoundField DataField="ContractNumber" HeaderText="ContractNumber" ReadOnly="True" SortExpression="ContractNumber" /> <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" /> <asp:BoundField DataField="Road" HeaderText="Road" SortExpression="Road" /> <asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" /> <asp:BoundField DataField="LeaseDateFrom" HeaderText="LeaseDateFrom" SortExpression="LeaseDateFrom" /> <asp:BoundField DataField="LeaseDateTo" HeaderText="LeaseDateTo" SortExpression="LeaseDateTo" /> </Columns> </asp:GridView> </td> </tr> <tr> <td> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:长铁物业公司资产数据库ConnectionString2 %>" SelectCommand="SELECT ContractNumber, City, Road, Address, LeaseDateFrom, LeaseDateTo FROM ContractTable WHERE (ISNULL(@LeaseDateTo, '') = '') OR (LeaseDateTo >= @LeaseDateTo) AND (ISNULL(@LeaseDateTo1, '') = '') OR (LeaseDateTo <= @LeaseDateTo1)"> <SelectParameters> <asp:ControlParameter ControlID="TextBox1" DbType="Date" Name="LeaseDateTo" PropertyName="Text" /> <asp:ControlParameter ControlID="TextBox2" Name="LeaseDateTo1" PropertyName="Text" /> </SelectParameters> </asp:SqlDataSource> </td> </tr> </table> </div> </form> </body> </html>
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
- 已编辑 linjiangxian11 2011年8月27日 14:07
-
<asp:ControlParameter ControlID="TextBox1" DbType="Date" Name="LeaseDateTo" PropertyName="Text" /> <asp:ControlParameter ControlID="TextBox2" Name="LeaseDateTo1" PropertyName="Text" />
這兩行因為在SQL語句已經把NULL的狀況改為空字符串
所以這兩行要多追加粗體字部份
<asp:ControlParameter ControlID="TextBox1" DbType="Date" Name="LeaseDateTo" PropertyName="Text" ConvertEmptyStringToNull="false"/> <asp:ControlParameter ControlID="TextBox2" Name="LeaseDateTo1" PropertyName="Text" ConvertEmptyStringToNull="false" />
Shadowと愉快なコード達
-
出现了这个错误,以前遇到过,下面是我上次提问的链接:
http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/3ec7faa3-9d51-4cad-a70e-8518352fe954
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把! -
把DBType拿掉試試應該就行了
<asp:ControlParameter ControlID="TextBox1" DbType="Date" Name="LeaseDateTo" PropertyName="Text" ConvertEmptyStringToNull="false"/> <asp:ControlParameter ControlID="TextBox2" Name="LeaseDateTo1" PropertyName="Text" ConvertEmptyStringToNull="false" />
Shadowと愉快なコード達
-
晕!这样就解决了我的历史老大难问题!谢谢咯!
再多问两个问题:
问题1:DbType是表示该TextBox1能接受的数据类型为Date吧?我记得这个DbType="Date"是自动生成的,Textbox2怎么没自动生成呢?
问题2: ConvertEmptyStringToNull 这个属性从字面上理解是"把空的字符串转化为空值"吧?一般是什么时候用呢?对于您前面的讲解还不是很明白,为什么要设置成‘false’?
-----------------------------------------------------
這兩行
因為在SQL語句已經把NULL的狀況改為空字符串
所以這兩行要多追加粗體字部份
<asp:ControlParameter ControlID="TextBox1" DbType="Date" Name="LeaseDateTo" PropertyName="Text" ConvertEmptyStringToNull="false"/> <asp:ControlParameter ControlID="TextBox2" Name="LeaseDateTo1" PropertyName="Text" ConvertEmptyStringToNull="false" />
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把! -
晕!这样就解决了我的历史老大难问题!谢谢咯!
再多问两个问题:
问题1:DbType是表示该TextBox1能接受的数据类型为Date吧?我记得这个DbType="Date"是自动生成的,Textbox2怎么没自动生成呢?
问题2: ConvertEmptyStringToNull 这个属性从字面上理解是"把空的字符串转化为空值"吧?一般是什么时候用呢?对于您前面的讲解还不是很明白,为什么要设置成‘false’?
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!-----------------------------------------------------
這兩行
因為在SQL語句已經把NULL的狀況改為空字符串
所以這兩行要多追加粗體字部份
<asp:ControlParameter ControlID="TextBox1" DbType="Date" Name="LeaseDateTo" PropertyName="Text" ConvertEmptyStringToNull="false"/> <asp:ControlParameter ControlID="TextBox2" Name="LeaseDateTo1" PropertyName="Text" ConvertEmptyStringToNull="false" />
问题1:工具配置的東西就是有時候會自動加上DBType有時候又不會,不過我幾乎都是手寫代碼,所以這方面並沒有深入瞭解问题2: 設為false,是要確保TextBox未輸入時就當做字符串,因為SQL語句裡已用ISNULL()把空值情況改為空字符串,所以這邊才要跟著配合改為false
Shadowと愉快なコード達
-
谢谢您的解答!我基本理解了!刚才才发现之前的讨论是离题的的讨论!其实解决一楼的方法很简单,就是在后面加一句黑体字部分语句:select * from Table1 where (ISNULL(@Time1,N'')='1999-01-01' or Time=@Time) or Time1 is Null
)不过在您的帮助下我终于得到了最完美的解决方案:
步骤1.SQL语句:
SELECT ContractNumber, City, Road, Address, LeaseDateFrom, LeaseDateTo FROM ContractTable WHERE (ISNULL(@LeaseDateTo, '') = '') or LeaseDateTo>=@LeaseDateTo) and (ISNULL(@LeaseDateTo1,'')='' or LeaseDateTo<=@LeaseDateTo1) or LeaseDateTo is Null
步骤2:将ConvertEmptyStringToNull设置为false,如果有DbType就取消它!
==========是这样做的么?
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把! -
谢谢您的解答!我基本理解了!刚才才发现之前的讨论是离题的的讨论!其实解决一楼的方法很简单,就是在后面加一句黑体字部分语句:select * from Table1 where (ISNULL(@Time1,N'')='1999-01-01' or Time=@Time) or Time1 is Null
)不过在您的帮助下我终于得到了最完美的解决方案:
步骤1.SQL语句:
SELECT ContractNumber, City, Road, Address, LeaseDateFrom, LeaseDateTo FROM ContractTable WHERE (ISNULL(@LeaseDateTo, '') = '') or LeaseDateTo>=@LeaseDateTo) and (ISNULL(@LeaseDateTo1,'')='' or LeaseDateTo<=@LeaseDateTo1) or LeaseDateTo is Null
步骤2:将ConvertEmptyStringToNull设置为false,如果有DbType就取消它!
==========是这样做的么?
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
不不,最後加的「 or Time1 is Null」這是多餘的您要想想看原本的SQL語句代表什麼意思:
select * from Table1 where (ISNULL(@Time1,N'')='1999-01-01' or Time=@Time)
這樣表示TextBox有輸入的話,就去 找符合Time= TextBox參數 的數據
TextBox沒輸入的話,就看ISNULL(@Time1,N'')='1999-01-01' 這句話成不成立,因為'' 不等於'1999-01-01',所以您一開始才會撈不到數據
個人覺得比較精簡的寫法還是:
SELECT ContractNumber, City, Road, Address, LeaseDateFrom, LeaseDateTo FROM ContractTable WHERE (ISNULL(@LeaseDateTo, '') = '') or LeaseDateTo>=@LeaseDateTo)
搭配參數:
<asp:ControlParameter ControlID="TextBox1" Name="LeaseDateTo"
PropertyName="Text" ConvertEmptyStringToNull="false"/>
如此一來,TextBox1沒輸入時,ISNULL(@LeaseDateTo, '') = '' 此條件成立=>撈得到數據
TextBox1有輸入時,LeaseDateTo>=@LeaseDateTo,撈出符合LeaseDateTo>=TextBox1輸入的參數 的數據
Shadowと愉快なコード達
-
可能是我在一楼的帖子说的不够清楚!并不是TextBox输入条件为空的时候有问题,而是在数据库中某些行的LeaseDateTo列本来就是空值,这些行就算你设置了ISNULL(@LeaseDateTo, '') = '',它也不会显示。
我实例测试了:如果不加上'or LeaseDateTo is Null',界面一打开的时候确实显示了所有数据,一旦在TextBox中输入了时间,那么会显示数据库中LeaseDateTo非空的行,而LeaseDateTo为Null的行不会显示。
只有在Where条件中加入'or LeaseDateTo is Null' 才能完整显示!
您可以在数据库中编个没有LeaseDateTo的记录试试!我也是偶然发现这种容易被忽略的情况的!
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把! -
可能是我在一楼的帖子说的不够清楚!并不是TextBox输入条件为空的时候有问题,而是在数据库中某些行的LeaseDateTo列本来就是空值,这些行就算你设置了ISNULL(@LeaseDateTo, '') = '',它也不会显示。
我实例测试了:如果不加上'or LeaseDateTo is Null',界面一打开的时候确实显示了所有数据,一旦在TextBox中输入了时间,那么会显示数据库中LeaseDateTo非空的行,而LeaseDateTo为Null的行不会显示。
只有在Where条件中加入'or LeaseDateTo is Null' 才能完整显示!
您可以在数据库中编个没有LeaseDateTo的记录试试!我也是偶然发现这种容易被忽略的情况的!
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
如果您的需求為輸入TextBox時,連帶Null的數據也要撈出來的話,確實就要加上or LeaseDateTo is Null 了
Shadowと愉快なコード達- 已标记为答案 linjiangxian11 2011年8月27日 15:44