Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

如何隐藏数据库窗体中的查询表

cad  发表于:2008-06-08 19:20:01  
复制

请教各位老师:

  下面是一段用来隐藏表与链接表的代码,能否改一下,用于隐藏查询表?

 

Sub asdfasdfa() '隐藏所有表

'调用方法 Call asdfasdfa
'重新启动数据库后生效
    For Each tabdef In CurrentDb.TableDefs
        Debug.Print tabdef.Name
        Debug.Print tabdef.Attributes
        If tabdef.Attributes = 0 Then
            tabdef.Attributes = 1
        End If
    Next
End Sub

'---------------------

Sub asdfasdfa1() '显示所有表
'调用方法 Call asdfasdfa1
'重新启动数据库后生效
    For Each tabdef In CurrentDb.TableDefs
        Debug.Print tabdef.Name
        Debug.Print tabdef.Attributes
        If tabdef.Attributes = 1 Then
            tabdef.Attributes = 0
        End If
    Next
End Sub

 

Top
小魏 发表于:2008-06-08 22:28:48

Function YinCangChaXun()
On Error GoTo Err_Com1

'==========================================
'隐藏系统中所有的查询,以确保不会被非法链接,
'DoCmd.SetWarnings 0     '关闭系统提示

Dim db3 As Database
Dim ii As Integer
    Set db3 = DBEngine.Workspaces(0).Databases(0)    
    db3.QueryDefs.Refresh
    For ii = db3.QueryDefs.Count - 1 To 0 Step -1   
      Application.SetHiddenAttribute acQuery, db3.QueryDefs(i).name, True
    Next ii
    Set db3 = Nothing    
MsgBox "当前数据库中的所有查询都已被隐藏."   
 
Exit_Com1:
    Exit Function

Err_Com1:
   ' MsgBox Err.Description
    Resume Exit_Com1
' DoCmd.SetWarnings -1
End Function

 

我写的这段代码应该可以解决你的问题.只是目前这段代码在实际运行时还有点问题,那就是总会去试图隐藏系统查询而不得.所以,需要关闭系统提示.否则会烦死了,哈哈.



十段 发表于:2008-06-08 22:58:42

你用下面的代码就可以达到你想要的功能了:

Private Sub Command1_Click()
Call asdfasdfa
End Sub

Private Sub Command2_Click()
Call asdfasdfa1
End Sub



cad 发表于:2008-06-09 11:31:17

一楼 huangqinyong 老师:

  你好!我将你写的代码利用按钮事件单击执行,2007ACCESS数据库导航窗格中的查询表依然存在,就是重新启动后也存在。请问是那里出了问题?因为我需要的是一个过程,你给我的是一个函数,我试作将改为过程调用也不行,请指点。

 

二楼 huangqinyong 老师:

  你给的代码是隐藏窗体中表或链接表的过程。在我的程序中已经运用了,我需要的是调用隐藏窗体中查询表的代码,谢谢!请你指点。 

 



十段 发表于:2008-06-09 11:57:27
你贴出的代码只能在07版以下用的,而且只是隐藏表的,在窗体中的隐藏不了表或、查询表的

小魏 发表于:2008-06-09 15:53:00

不好意思,上面的这段代码有误.需要修改一下.如下:

把这段代码放入到模块中.然后在窗体事件中调用即可.  CALL YINCANGCHAXUN() 

 

Function YinCangChaXun()
On Error GoTo Err_Com1

'==========================================
'隐藏系统中所有的查询,以确保不会被非法链接,
'DoCmd.SetWarnings 0     '关闭系统提示

 

Dim db As Database
Dim i As Integer
    Set db = DBEngine.Workspaces(0).Databases(0)
   
    db.QueryDefs.Refresh
    For i = db.QueryDefs.Count - 1 To 0 Step -1
   ' MsgBox db.QueryDefs(i).Name
  
      Application.SetHiddenAttribute acQuery, db.QueryDefs(i).Name, True
       'MsgBox db.QueryDefs(i).Name
    Next i
    Set db = Nothing
    
MsgBox "当前数据库中的所有查询都已被隐藏."

 
Exit_Com1:
    Exit Function

Err_Com1:
   ' MsgBox Err.Description
    Resume Exit_Com1
' DoCmd.SetWarnings -1
End Function



cad 发表于:2008-06-10 00:26:32

5楼 weizw55 老师:

  你好!你的这段代码不错,你是运用对象属性表中的隐藏特性来实现的,在2007的导航窗格中所有的查询表已经变为灰色,这说明程序已经达到使用目的,在此非常感谢你的帮助!

  不过我还要向你请教一下,我发的原帖,作者是将表完全从导航窗格中隐藏了,请问查询表也能这样隐藏吗?



小魏 发表于:2008-06-10 10:15:14

是的,这个问题我也研究了许久,一直也不能解决.目前只能通过现有的方法来处理.因为查询不是一个有效的对象,只是一段SQL代码,所以,有些属性是不支持的.现有的方式也可以了,至少可以阻止一般用户的非法链接了.另外,你还可以将此方法与另外一种方法同时使用.即在所有的查询的名字前加"USYS",将查询变成系统表.这样安全系数就大大提高了.



cad 发表于:2008-06-10 13:03:37

7楼 weizw55 老师:

  请问你用的是2007吗?在数据库导航选项页中,有一个显示隐藏对象选项,用一个代码去掉小钩,再配上你的代码,效果将是最为完美的了,如果你用的是2000或2003,能使显示隐藏对象选项小钩去掉的话,那么,在2007中将同样有效。谢谢!

  在所有的查询的名字前加"USYS",是能在当前库中隐藏表或查询表,当使用另外一个数据库导入它时,此表将同样被导出。

  



小魏 发表于:2008-06-10 13:52:32

是的,需要几种方式结合起来同时使用.这样效果更好.

我用的ACCESS2003,

另外还有一个思路,即将所有的查询全部变成SQL代码并放在模块中,在系统启动时执行这些模具块,将SQL变成查询.在系统退出时,再将这些查询删除掉.这要就安全了.呵呵.只是这个思路是可以行得通,可是我没有写过代码.你可以自己研究一下即可.

 

我目前用的系统,为了安全,将所有的链接表直接删除掉,然后在系统启动时,再将链接表加入进去.也成功了.



cad 发表于:2008-06-10 23:06:27

9楼 weizw55 老师:

  你好!再次感谢你的帮助!让我们共同努力吧!



cad 发表于:2008-06-11 00:58:36

本人已经解决:最佳答案如下

 

利用按钮事件过程执行以下代码:

 

Private Sub Command0_Click()
On Error GoTo Err_Com1

'==========================================
'隐藏系统中所有的查询,以确保不会被非法链接,

Dim db As Database
Dim i As Integer
    Set db = DBEngine.Workspaces(0).Databases(0)
   
    db.QueryDefs.Refresh
    For i = db.QueryDefs.Count - 1 To 0 Step -1
      Application.SetHiddenAttribute acQuery, db.QueryDefs(i).Name, True
    
    Next i
    Set db = Nothing
    
MsgBox "当前数据库中的所有查询都已被隐藏."

 
Exit_Com1:
    Exit Sub

Err_Com1:
 
    Resume Exit_Com1

Application.SetOption "显示隐藏对象", True

End Sub

Private Sub Command1_Click()
On Error GoTo Err_Com1

'==========================================
'显示系统中所有的查询

Dim db As Database
Dim i As Integer
    Set db = DBEngine.Workspaces(0).Databases(0)
   
    db.QueryDefs.Refresh
    For i = db.QueryDefs.Count - 1 To 0 Step -1
 
      Application.SetHiddenAttribute acQuery, db.QueryDefs(i).Name, False
     
    Next i
    Set db = Nothing
    
MsgBox "当前数据库中的所有查询都已被显示."

 
Exit_Com1:
    Exit Sub

Err_Com1:
 
    Resume Exit_Com1

Application.SetOption "显示隐藏对象", False
End Sub



总记录:11篇  页次:1/1 9 1 :