怎样在vb中调用IsContain函数

aeae12 2007-10-26 06:46:14
查询语句如下:

SELECT *
FROM CompareBase INNER JOIN Zd_Xm5 ON IsContain(CompareBase.Xm_name,zd_xm5.Xm_name) = True;

函数定义如下:

Public Function IsContain(str1 As String, str2 As String) As Boolean



IsContain = False

If InStr(str2, str1) > 0 Then
'不论str1长度多少,只要str1完全在str2中,认为符合条件
IsContain = True
Else
If Len(str1) <= 5 Then
'因为不完全包含,且str1长度小于等于5,认为不符合
IsContain = False
Else
'str1长度 >5,需要循环判断str1中的任意连续5个字符是否在str2中
Dim i As Integer
i = 1
For i = 1 To Len(str1) - 4
If InStr(str2, Mid(str1, i, 5)) > 0 Then
IsContain = True
Exit For
End If
Next i
End If
End If

End Function

以上代码在ACCESS中测试没问题
我用adodc连接access数据库,要求数据库中不建立查询,怎样在vb中实现上面的功能,调用IsContain函数呢,哪位大哥给段源码,越完整越好,我水平很滥的。不胜感激
...全文
704 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
vbman2003 2007-10-30
  • 打赏
  • 举报
回复
这样的话直接用SQL语句应该是不行的了,如果是SQL数据库可以写函数或存储过程解决,这个用VB去ACCESS查询的确有点费事。如果能从表结构上去解决最好了,就是分别在表1表2上给这样的情况添加关联字段。不然查询起来太没效率了



vbman2003 2007-10-29
  • 打赏
  • 举报
回复
那就没有办法了吗,能在给点提示吗,有人说参数运行可以,有人说将数据集取到前台后处理,到底那种是正确的呢
-------------------------------------------------------
你的函数在VB下,输入VB定义的参数是可以在VB环境下运行的,但放入SQL语句中,把数据库表中字段做参数,jet-sql识别不的,比如:

dim sql as string
dim p1 string,p2 as string
dim b as boolean
p1="abcdefg"
p2="xyz"

b=IsContain(p1,p2)
sql="select * from tb where fld ="& IsContain(p1,p2)
sql="select * from tb where fld ="& b
以上都是可以执行的,因为 IsContain根据VB中的参数,在VB下执行,只是将结果做为sql语句中某字段的查询条件,你可以debug.print sql 看看这种情况下完整的SQL语句是什么样的

而你的问题中SQL语句类似是这样的:
sql="select * from tb where fld = IsContain(tb.fld1,tb.fld2)"
同样你debug.print sql 看看这种情况下完整的SQL语句是什么样的,IsContain交由jet-sql去执行了,jet-sql中没有这个函数,当然不对了

要解决问题,光看你的代码是分析不了的,你可以用简单数据示例一下你的相关表和要的结果

还有同一问题希望你不要胡乱发贴,论坛不允许这样做







要解决你的问题,
aeae12 2007-10-29
  • 打赏
  • 举报
回复
那就没有办法了吗,能在给点提示吗,有人说参数运行可以,有人说将数据集取到前台后处理,到底那种是正确的呢
aeae12 2007-10-29
  • 打赏
  • 举报
回复
VBMEN2003:

谢谢你的提醒,我以后不再乱发贴了,我是编程新手,也刚开始上论坛,以后我会注意的,请再帮帮忙。

是这样的这是一段按两个表中的两个字段的字符串的匹配程度查询的函数:

比如表1的name字段中有一条数据“abcdefg”,表2的name字段有一条数据“abcdehq”,表一中的“abcdefg”和表二
中的“abcdehq”即不包含也不相等,但是它们在数据库中经过
SELECT *
FROM CompareBase INNER JOIN Zd_Xm5 ON IsContain(CompareBase.Xm_name,zd_xm5.Xm_name) = True;

查询能显示在一起,函数定义表1中的name字段有五个字符与表二中的name字段相等就对应显示在一起,类似于

SELECT *
FROM CompareBase INNER JOIN Zd_Xm5 ON InStr(CompareBase.Xm_name,zd_xm5.Xm_name)

完全包含变成了五个字相同

你上面给我写的,我该怎样定义P1和P2

完成定义后按我的软件要求,在程序中应该怎样写SQL,这样取出的数还能显示在tdbgrid或dbgrid上吗

谢谢,谢谢了。
vbman2003 2007-10-29
  • 打赏
  • 举报
回复
怎样将这段函数改成vb能调用的函数呢
--------------------------------------------------------

你要弄清几个概念,你的代码涉及了三个对象:
1.VB
2.access数据库的mdb文件
3.数据库引擎

VB是通过数据库引擎去访问mdb的,VB发送给数据库引擎的指令,也就是SQL语句必须是数据库引擎本身可以识别的,SQL语句遵循的是数据库引擎的规范,而不是VB语法。你的 IsContain函数是你在VB中自定义的函数,函数本身在VB中是可以正常执行的,但你放入SQL语句中,数据库引擎是识别不了这个VB函数的。

还有,你在ACCESS定义了这个函数,在ACCESS环境下你可以在任何地方调用,包含SQL语句。比如你可以在ACCESS模块中声明你问题中的函数,并在ACCESS查询中建立一个调用你这个函数的查询,这样你就可在ACCESS环境中使用这个查询。但是VB中要去调用这个查询依然不行,为什么呢,同样的道理,数据库引擎只集成了ACCESS内置函数,它识别不了ACCESS自定义函数!


huaxinrui 2007-10-29
  • 打赏
  • 举报
回复
VBMEN2003:

谢谢你的提醒,我以后不再乱发贴了,我是编程新手,也刚开始上论坛,以后我会注意的,请再帮帮忙。

是这样的这是一段按两个表中的两个字段的字符串的匹配程度查询的函数:

比如表1的name字段中有一条数据“abcdefg”,表2的name字段有一条数据“abcdehq”,表一中的“abcdefg”和表二
中的“abcdehq”即不包含也不相等,但是它们在数据库中经过
SELECT *
FROM CompareBase INNER JOIN Zd_Xm5 ON IsContain(CompareBase.Xm_name,zd_xm5.Xm_name) = True;

查询能显示在一起,函数定义表1中的name字段有五个字符与表二中的name字段相等就对应显示在一起,类似于

SELECT *
FROM CompareBase INNER JOIN Zd_Xm5 ON InStr(CompareBase.Xm_name,zd_xm5.Xm_name)

完全包含变成了五个字相同

你上面给我写的,我该怎样定义P1和P2

完成定义后按我的软件要求,在程序中应该怎样写SQL,这样取出的数还能显示在tdbgrid或dbgrid上吗

谢谢,谢谢了。
aeae12 2007-10-27
  • 打赏
  • 举报
回复
谢谢回帖!

然后处理IsContain是怎么处理呢,能说的祥细一点吗
aeae12 2007-10-27
  • 打赏
  • 举报
回复
怎样将这段函数改成vb能调用的函数呢
aeae12 2007-10-27
  • 打赏
  • 举报
回复
能帮我写一段代码吗,我有点理解不了谢谢
yangzn76 2007-10-27
  • 打赏
  • 举报
回复
这句SQL有好像有些问题
SELECT *
FROM CompareBase INNER JOIN Zd_Xm5 ON IsContain(CompareBase.Xm_name,zd_xm5.Xm_name) = True;

应该为:
select *
FROM CompareBase ,Zd_Xm5
where CompareBase.??=Zd_Xm5.??? and
IsContain(CompareBase.Xm_name,zd_xm5.Xm_name) = True

另外,在VB中,好像是不能用AcessSQL 里的自定义函数.

所以你在应先把数据取出来。然后,在VB里加工
所以SQL应该改为:
select *
FROM CompareBase ,Zd_Xm5
where CompareBase.??=Zd_Xm5.???
然后,在VB中读取合符条件的记录,然后处理IsContain(比如说插入到一张临时表)



vbman2003 2007-10-27
  • 打赏
  • 举报
回复
就是说只能先再access中建立“查询”,然后在程序中select“查询”是吗
---------------------------------
不是,你用VBA写的函数,在ACCESS查询中调用可以在ACCESS环境中返回正确结果,但VB调用这个查询也不行,VB只可调用ACCESS内置函数
还有VB可以调用ACCESS查询中的查询返回记录集,也可以直接用SELECT语句对数据库的表直接查询返回记录集,这些引用ADO就可以了
aeae12 2007-10-27
  • 打赏
  • 举报
回复
就是说只能先再access中建立“查询”,然后在程序中select“查询”是吗
vbman2003 2007-10-27
  • 打赏
  • 举报
回复
你在ACCESS的VBA环境下写的函数只能用于ACCESS环境,VB只能调用ACCESS内置函数,自定义函数不行

1,217

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧