Office中国论坛/Access中国论坛

标题: sql语句中如何自动判断数据类型 [打印本页]

作者: 软件下载    时间: 2011-10-14 20:28
标题: sql语句中如何自动判断数据类型
我有个窗体fom1
form1.recordsource="select * from 表名 where 字段1=" & 变量
如果我将字段1的数据类型由数字改为文本,按道理这个form1的记录源就是"select * from 表名 where 字段1='" & 变量 & "'"
现在有什么办法,在无论更改字段1为何类型的情况下,form1的记录源这段代码都不用改的。我现在用的就是typename来判断字段1的数据类型,要多写好几行代码。


作者: todaynew    时间: 2011-10-14 20:42
本帖最后由 todaynew 于 2011-10-14 20:47 编辑

任尔东西南北风,一个函数收囊中。
莫管类型八九种,转成文本皆能用。

form1.recordsource="select * from 表名 where Cstr(字段1)='" & 变量 & "'"

作者: zhuyiwen    时间: 2011-10-15 10:07
高招!
作者: 软件下载    时间: 2011-10-17 20:06
todaynew 发表于 2011-10-14 20:42
任尔东西南北风,一个函数收囊中。
莫管类型八九种,转成文本皆能用。

谢谢,我的窗体中字段1也是用的变量,以前用这个方法总是提示错误,刚才仔细研究了一下,发现是代码的问题:
我以前写的是:
form1.recordsource="select * from 表名 where " & CStr(字段变量) & " ='" & 变量 & "'"
实际上应该写成:
form1.recordsource="select * from 表名 where CStr(" & 字段变量 & ") ='" & 变量 & "'"
这下要少写很多代码了.
作者: 软件下载    时间: 2011-10-17 20:20
刚才测试了一下,还有一个问题:我其中一个字段是Boolean类型,用上面这个代码后,由于窗体中B型字段值都是0或-1而不是true或false,所以cstr后就提示类型不符,这个怎么解决?


作者: aslxt    时间: 2011-10-17 20:28
也可以用这个函数(我一直用的,相对要麻烦一点)
Function ColType(ByVal TabelName As String, ByVal ColName As String)
  'TabelName---表名称
  'ColName---字段名称
  '由于动态查询、筛选需要过滤某些内容,但是不知道某字段是文本、日期、数字类型,会导致代码错误,本函数返回某表某字段的数据类型的那个符号(对应"'"、"#"、"")
  '
  Dim str
  Dim B
  Dim A
  Dim C
  Dim st
  Dim Conn As ADODB.Connection
  Set Conn = CurrentProject.Connection
  Dim rc As ADODB.Recordset
  Set rc = New ADODB.Recordset
  rc.Open "select top 1 * from " & TabelName, Conn, adOpenStatic, adLockReadOnly
  For i = 0 To rc.Fields.Count - 1
    B = rc.Fields(i).Type
    A = rc.Fields(i).Name
    If A = ColName Then
      C = B
      Exit For
    End If
  Next i
  
  Select Case C
  Case 3, 131, 6
    st = ""
  Case 7
    st = "#"
  Case Else
    st = "'"
  End Select
  Debug.Print st
  ColType = st
End Function

作者: 软件下载    时间: 2011-10-17 20:53
aslxt 发表于 2011-10-17 20:28
也可以用这个函数(我一直用的,相对要麻烦一点)
Function ColType(ByVal TabelName As String, ByVal Co ...

我那个程序有近百个表,窗体中左边是树按类别加载各表,右边是树中对应的表,树中可实现按表任意字段分级显示的功能.

在点击树中任一级时,右边的窗体就会按照该级各对应的字段打开记录,中间有好多循环和嵌套,很麻烦,你这个代码我不知道放到哪里合适,不过还是谢谢了.

如下:
窗体左边是树,结构可能如下
表1
--表1.字段1(文本)
----表1.字段2(日期)
表2
--表2.字段2(文本)
表3
--表3.字段1(是否)
----表3.字段3(文本)
------表3.字段4(数字)
现在点击最下面那个表3.字段4,在窗体右边的子窗体就要加载一个记录源为"select * from 表3 where 表3.字段1=" & 是否变量 & " and 表3.字段3='" & 文本变量 & "' and 表3.字段4=" & 数字变量的窗体.
程序写了大半年,在边用边完善基本上已基本能稳定运行,确实提高了很多工作效率,只是有些问题至今还没有解决,比如如何保持前一个窗体打开时的状态,我现在用的笨办法,就是每打开一个窗体就把其当前记录和状态记录下来,显示在下面的组合框中.
作者: todaynew    时间: 2011-10-17 20:56
软件下载 发表于 2011-10-17 20:20
刚才测试了一下,还有一个问题:我其中一个字段是Boolean类型,用上面这个代码后,由于窗体中B型字段值都是0 ...

那不一样吗?
转换以后就是"-1"和"0"
作者: 软件下载    时间: 2011-10-17 22:09
本帖最后由 软件下载 于 2011-10-17 22:09 编辑
todaynew 发表于 2011-10-17 20:56
那不一样吗?
转换以后就是"-1"和"0"


我测试过了,比如当前窗体记录源="select * from 表 where 字段3=true"
在窗体中获取字段3的值时则为-1
不转换时记录源为"select * from 表 where 字段3=-1",这个是能正常运行的
转换后记录源为"select * from 表 where 字段3='-1'",这个就不能正常运行了。
因为B类型的字段-1和true同等的,但"-1"就不同了。
印象中好像哪里可以设置窗体中B字段的值为"true“或"false”,而不是“0”和"-1",目前还没有搜索到。



作者: todaynew    时间: 2011-10-18 09:13
"select * from 表 where Cstr(字段3)='" & true & "'"

这会不对吗?
作者: 软件下载    时间: 2011-10-18 19:31
todaynew 发表于 2011-10-18 09:13
"select * from 表 where Cstr(字段3)='" & true & "'"

这会不对吗?

老大,我在ACCESS的查询里测试了,不行啊。

select * from 表 where Cstr(字段3)=‘true'出不来结果,空记录。

select * from 表 where Cstr(字段3)=true或select * from 表 where 字段3=true都正常显示

是不是B类型字段无法用Cstr转换成文本?我的access2003和2007测试都没通过。
作者: todaynew    时间: 2011-10-18 20:25
本帖最后由 todaynew 于 2011-10-18 20:27 编辑
软件下载 发表于 2011-10-18 19:31
老大,我在ACCESS的查询里测试了,不行啊。

select * from 表 where Cstr(字段3)=‘true'出不来结果, ...


你没搞错吧?呵呵。在好好看看我的写法。

"select * from 表 where Cstr(字段3)='" & true & "'" 的结果不是"select * from 表 where Cstr(字段3)=' true '",而是
"select * from 表 where Cstr(字段3)='-1'"






作者: 软件下载    时间: 2011-10-19 22:35
todaynew 发表于 2011-10-18 09:13
"select * from 表 where Cstr(字段3)='" & true & "'"

这会不对吗?

大哥,您能不能帮我测试一下您这个代码到底能不能用?

我在家里用access2007用SQL查询测试,用的是SELECT * FROM 表 WHERE cstr(字段3)='True',出来的结果和SELECT * FROM 表 WHERE 字段3=True不一样啊,一条记录都没有。

作者: todaynew    时间: 2011-10-20 20:18
本帖最后由 todaynew 于 2011-10-20 20:23 编辑
软件下载 发表于 2011-10-19 22:35
大哥,您能不能帮我测试一下您这个代码到底能不能用?

我在家里用access2007用SQL查询测试,用的是SEL ...


呵呵,你怎么回事呀?
不是告诉你不是'True',而是'-1'吗?

因为 SELECT  * FROM 表 WHERE 字段3=True  等价于 SELECT  * FROM 表 WHERE 字段3=-1

又因为 SELECT  * FROM 表 WHERE 字段3=-1      等价于 SELECT  * FROM 表 WHERE Cstr(字段3)="-1 "

所以 SELECT  * FROM 表 WHERE 字段3=True  等价于 SELECT  * FROM 表 WHERE Cstr(字段3)="-1 "

True 和False是Access的保留字,这两个保留字分别代表布尔值-1和0,明白否?


作者: 软件下载    时间: 2011-10-21 18:20
我在代码里中断测试了一下
窗体.recordsource="select * from 表 where Cstr(字段3)='" & true & "'" 的结果出来就是"select * from 表 where Cstr(字段3)=' true '"啊,不是您这个"select * from 表 where Cstr(字段3)='-1'"

在查询的sql视图中select * from 表 where Cstr(字段3)='" & true & "'"根本无法运行。

我的程序是这样的:
窗体中有个treeview,某个节点的node.tag值就是布尔型,现在我希望点中该节点后在右边子窗体中打开对应的窗体,我用下面这个代码:
子窗体.recordsource="select * from 表 where cstr(字段3)='" & node.tag & "'"

因为node.tag就是true或false,所以上面这段代码就相当于执行下面代码:
="select * from 表 where cstr(字段3)='" & true & "'"
这样就总会提示错误。
解决方法:
1是获取node的布尔值0或-1,可我查了node属性里没有这个,tag返回的都是true或false
2是在加载treeview时将node值直接显示为0和-1,再将上面代码node.tag改为node.text,我能测试通过,只是程序中用0或-1显示节点不是很直观。目前我加载treeview节点时有个判断node的typename,如果是布尔型就将其text显示为node.tag & rec.field(字段)(如false日期)

不知道老大还有什么好的办法,其实说来说去,我认为就是布尔型字段无法用cstr转换,比如字段1=false,cstr(字段1)='false'就不行,其他字段没一一测试,但应该都能通过。

老大



作者: 软件下载    时间: 2013-10-30 19:01
todaynew 发表于 2011-10-18 09:13
"select * from 表 where Cstr(字段3)='" & true & "'"

这会不对吗?

老大,今天在改这个程序,试了你这个用法,运行没有错误,但没有任何结果,用select * from 表 where 字段3=true就是对的。我换成cvar也不行,就是Boolean这个问题难解决




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3