以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  如何判断视图中的某列是否是日期列?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=99935)

--  作者:happyft
--  发布时间:2017/4/30 12:13:00
--  如何判断视图中的某列是否是日期列?
如下面的语句是一个通用的查询where条件的表达式:
Dim flt As String ="生产单号\\订单编号\\生产日期\\订单数量"  \' 这些是在视图中的部份列
Dim Cls() As String = flt.split("\\")
For i As Integer = 0 To Cls.Length -1
    If flt > "" Then
        flt = flt & " or "
    End If
    \'If Tables("表A").Cols(Cls(i)).IsDate Then  \'将日期转换为字符才能用like条件查询
    if uv_sc001.Cols(Cls(i)).IsDate Then   \'这里应该如何写?
        flt = flt & " Convert(" & Cls(i) & ",\'System.String\') like " & txt
    Else
        flt = flt & Cls(i) & " like " & txt
    End If
Next

Se lect * from uv_sc001 where " & flt

如果是从一个视图中通过where条件查询数据,
上面语句中红色部份,要判断视图中那列是否是日期列,应该如何写代码?
谢谢!

--  作者:有点蓝
--  发布时间:2017/5/2 8:32:00
--  
Tables("uv_sc001").Cols(Cls(i)).IsDate
--  作者:HappyFt
--  发布时间:2017/5/2 16:41:00
--  
那样会提示不存在名这"uv_sc001"的表
--  作者:有点蓝
--  发布时间:2017/5/2 17:23:00
--  
你要先加载这个表,才能判断这个表的列的类型。

可以使用sqlcommand先获取一个空的临时表

--  作者:HappyFt
--  发布时间:2017/5/9 10:34:00
--  
但这个视图是从多个表查询来的,不可能每个相关的数据表都加载吧,

        Dim sql,flt As String

        \'---加载表结构进来方便判断日期列

        sql = "se lect * from uv_sc001 where _identify < 0"

        Dim cmd As New SQLCommand

        cmd.ConnectionName = Mydata

        cmd.CommandText = sql

        Dim dt As DataTable = cmd.ExecuteReader()

       

        Dim Cls() As String = dr("FindCols").split("\\")

        For i As Integer = 0 To Cls.Length -1

            If flt > "" Then

                flt = flt & " or "

            End If

            If dt.dataCols(Cls(i)).IsDate Then  \'将数值或日期转换为字符(日期列判断必须要先加入表结构否则出错)

                flt = flt & " Convert(" & Cls(i) & ",\'System.String\') like " & txt

            Else

                flt = flt & Cls(i) & " like " & txt

            End If

        Next

直接加载视图执行时如果有日期列就会显示错误:

"类型 交货日期 不是已定义的系统类型."

应该怎么办?



--  作者:有点色
--  发布时间:2017/5/9 10:51:00
--  

 那你试试这样写

 

msgbox(dt.DtaCols(Cls(i)).DataType.Name)


--  作者:HappyFt
--  发布时间:2017/5/9 11:33:00
--  
那样如果有日期列会显示datetime  我按下面的写法也会出错
if dt.dataCols(Cls(i)).DataType.Name = "datetime" Then 
msgbox(1) 
   flt = flt & " Convert(" & Cls(i) & ",\'System.String\') like " & txt
end if

用isdate和上面这两种写法都可以显示1出来,说明是下面红色的这句写法不对,应该如何写才对?
谢谢!

--  作者:有点色
--  发布时间:2017/5/9 11:35:00
--  
 最后弹出你的 msgbox(flt) 看看
--  作者:HappyFt
--  发布时间:2017/5/9 11:51:00
--  
客户 like \'%2017%\' or  Convert(制单日期,\'System.String\') like \'%2017%\' or 订单编号 like \'%2017%\' or 产品编码 like \'%2017%\' or 品名 like \'%2017%\' or 规格 like \'%2017%\' or  Convert(交货日期,\'System.String\') like \'%2017%\' or 业务员 like \'%2017%\'

我改成
flt = flt & " Convert(Nvarchar," & Cls(i) & ",120) like " & txt

就可以了,原来那样不知道为何不对?

--  作者:有点色
--  发布时间:2017/5/9 11:57:00
--  

 如果你去掉这个条件,Convert(交货日期,\'System.String\') like \'%2017%\',就可以查?

 

 你最后是要设置筛选,还是要设置加载?能否做个例子测试?