首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

请教一个关于“Distinct”过滤的查询有关问题

2012-01-26 
请问一个关于“Distinct”过滤的查询问题请问一个关于“Distinct”过滤的查询问题在datur表中有以下列:id,name

请问一个关于“Distinct”过滤的查询问题
请问一个关于“Distinct”过滤的查询问题


在datur表中有以下列   :id,name,userid
共计六条记录其中只有一对记录的“name”重复
现在要使用查询语句过滤掉   “name”相同的记录行代码如下:

Dim   rsCheck   As   New   ADODB.Recordset
Dim   DBstr   As   String
Dim   name   As   String

        DBstr   =   "select   Distinct   name   from   datur "
            rsCheck.Open   DBstr,   DBCnn,   adOpenStatic,   adLockOptimistic

        If   rsCheck.RecordCount   >   0   Then
              name   =   Trim(rsCheck.Fields( "name ").Value)            
             
        End   If

调试发现     rsCheck.RecordCount   =-1  

select   Distinct   name   from   datur   这句在企业管理器里验证过

请各位前辈指点一下我的代码应该如何写

[解决办法]
楼主说数据库的表里面有共计六条记录其中只有一对记录的“name”重复,那就是说查出来之后的Name应该有5个不同的值。怎么能够直接就把Trim(rsCheck.Fields( "name ").Value)的值赋给一个string型的变量name呢?应该需要循环的,而且也不能直接就用一个string型的变量name区接受相应的值啊?这样只能够得到最后一条记录的name值。
另外,二楼写的这一段
If Not rs.EOF Then Then
name = Trim(rsCheck.Fields( "name ").Value)
End If
和楼主写的
If rsCheck.RecordCount > 0 Then
name = Trim(rsCheck.Fields( "name ").Value)
End If
两则的效果是一样的



[解决办法]
如果他的表里有数据的话,而且他的SQL正确的话,我觉得查出来rsCheck.RecordCount 是不可能是-1的,你认为呢?按照道理,你上面写的代码就可以实现楼主说的功能的。
[解决办法]
Dim rsCheck As New ADODB.Recordset
Dim DBstr As String
Dim name As String

DBstr = "select Distinct name from datur "
rsCheck.Open DBstr, DBCnn, adOpenStatic, adLockOptimistic '这里游标类型和锁定类型不对 不能使用RecordCount 属性 另外 如果表中没有记录 RecordCount 也会出错

If rsCheck.RecordCount > 0 Then
For a = 0 To rsCheck.RecordCount - 1
name = Trim(rsCheck.Fields( "name ").Value)
Debug.print name
rsCheck.MoveNext
Next a
End If

[解决办法]
楼主的问题
1. adOpenStatic, adLockOptimistic ' 如果不是需要addnew操作的时候 要采用性能好的参数
2.记录机 是否为空的判断 rsCheck.RecordCount > 0 正确的应该是 判断.eof
3.For a = 0 To rsCheck.RecordCount - 1
for 后面的 to的参数最好是一个变量 否则在每次for循环的时候 他都会读取 你设置的属性或者运算 大大影响效率
4 Next a 这个是教科书上的写法 画蛇添足 而且降低效率
[解决办法]
rsCheck.RecordCount =-1 是因为默认下rs是服务器端游标,加一句试试:

......
rsCheck.CursorLocation = adUseClient
rsCheck.Open DBstr, DBCnn, adOpenStatic, adLockOptimistic
......
[解决办法]
服务器端游标效率要好一点。所以可以修改一下你的代码,不一定非要用rsCheck.RecordCount

Try:

Dim rsCheck As New ADODB.Recordset
Dim DBstr As String
Dim name As String

DBstr = "select Distinct name from datur "
rsCheck.Open DBstr, DBCnn, adOpenStatic, adLockOptimistic

while not rsCheck.eof
name = Trim(rsCheck.Fields( "name ").Value)
Debug.print name


rsCheck.MoveNext
wend

[解决办法]
哦,zyg0已经说过用rs.eof了,呵呵

热点排行