none
Date类型空值写法新问题! RRS feed

  • 问题

  •     以前我是这样达到时间空值效果的:

        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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年8月27日 3:42

答案

  •     可能是我在一楼的帖子说的不够清楚!并不是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と愉快なコード達
    2011年8月27日 15:27

全部回复

  • 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;或者讨论(Talk)
    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)
    慈善点击,点击此处
    2011年8月27日 6:22
  • select * from Table1 where (ISNULL(Time1,N'')='1999-01-01' or Time=@Time)

       就是字段Time1为空或等于变量@Time1时条件成立,而实际上如果数据库中有一行,它的Time1值为空,却不能选择到这一行!


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年8月27日 11:03
  • 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と愉快なコード達

    2011年8月27日 11:20
  • 那么可以这样写么?

    select * from Table1 where (ISNULL(Time1,N'')='' or Time=@Time

    然后把Control关联的缺省值不写(我以前是写了1999-01-01)


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年8月27日 11:54
  • 那么可以这样写么?

    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と愉快なコード達

    2011年8月27日 11:55
  • SELECT ContractNumber, City, Road, Address, LeaseDateFrom, LeaseDateTo FROM ContractTable WHERE (ISNULL(@LeaseDateTo, '') = '') OR (LeaseDateTo >= @LeaseDateTo)

     

        上面这个SQL语句我按照您的提示写的,界面一打开的时候是空白,必须在TextBox1中输入一个条件才能显示数据,并不能达到一打开界面就显示全部数据的效果!


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年8月27日 13:52
  • 能否把SqlDataSource貼上來看看?
    Shadowと愉快なコード達
    2011年8月27日 13:54
  • ======================前台=====================

    我测试过要输入条件才可以显示数据!!!那个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 &gt;= @LeaseDateTo) AND (ISNULL(@LeaseDateTo1, '') = '') OR (LeaseDateTo &lt;= @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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!


    2011年8月27日 14:04
  •   <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と愉快なコード達

    2011年8月27日 14:06
  • 出现了这个错误,以前遇到过,下面是我上次提问的链接:

    http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/3ec7faa3-9d51-4cad-a70e-8518352fe954

     


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年8月27日 14:15
  • 把DBType拿掉試試應該就行了

     <asp:ControlParameter ControlID="TextBox1" DbType="Date" Name="LeaseDateTo" 
     PropertyName="Text" ConvertEmptyStringToNull="false"/>
    
     <asp:ControlParameter ControlID="TextBox2" Name="LeaseDateTo1" 
     PropertyName="Text" ConvertEmptyStringToNull="false" />
    

     


    Shadowと愉快なコード達

    2011年8月27日 14:23
  • 晕!这样就解决了我的历史老大难问题!谢谢咯!

    再多问两个问题:

        问题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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年8月27日 14:37
  • 晕!这样就解决了我的历史老大难问题!谢谢咯!

    再多问两个问题:

        问题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と愉快なコード達

    2011年8月27日 14:45
  •     谢谢您的解答!我基本理解了!刚才才发现之前的讨论是离题的的讨论!其实解决一楼的方法很简单,就是在后面加一句黑体字部分语句: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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年8月27日 14:58
  •     谢谢您的解答!我基本理解了!刚才才发现之前的讨论是离题的的讨论!其实解决一楼的方法很简单,就是在后面加一句黑体字部分语句: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と愉快なコード達

    2011年8月27日 15:09
  •     可能是我在一楼的帖子说的不够清楚!并不是TextBox输入条件为空的时候有问题,而是在数据库中某些行的LeaseDateTo列本来就是空值,这些行就算你设置了ISNULL(@LeaseDateTo, '') = '',它也不会显示。

        我实例测试了:如果不加上'or LeaseDateTo is Null',界面一打开的时候确实显示了所有数据,一旦在TextBox中输入了时间,那么会显示数据库中LeaseDateTo非空的行,而LeaseDateTo为Null的行不会显示。

        只有在Where条件中加入'or LeaseDateTo is Null'  才能完整显示!

        您可以在数据库中编个没有LeaseDateTo的记录试试!我也是偶然发现这种容易被忽略的情况的!

     



    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年8月27日 15:23
  •     可能是我在一楼的帖子说的不够清楚!并不是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と愉快なコード達
    2011年8月27日 15:27
  • 谢谢您的耐心解答!祝您愉快!

        晚安!


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年8月27日 15:41