Foxtable(狐表)用户栏目专家坐堂 → 请教:外部数据源连接后,如何得到全部的表名称?


  共有15872人关注过本帖树形打印复制链接

主题:请教:外部数据源连接后,如何得到全部的表名称?

帅哥哟,离线,有人找我吗?
reachtone
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
请教:外部数据源连接后,如何得到全部的表名称?  发帖心情 Post By:2009/9/1 7:09:00 [只看该作者]

动态创建和切换数据源时,需要用到。请高手指教。。
[此贴子已经被作者于2009-9-1 7:12:35编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
qtcks
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By:2009/9/1 8:05:00 [只看该作者]

1.获取所有数据库名:
   (1)
Select Name FROM Master..SysDatabases order by Name
2.
获取所有表名:
   (1)Select Name FROM SysObjects Where XType=''U'' orDER BY Name
           XType=''U'':
表示所有用户表;
           XType=''S'':
表示所有系统表;

   (2)SELECT name FROM sysobjects WHERE type = ''U'' AND sysstat = ''83''

           注意:一般情况只需要type = ''U'',但有时候会有系统表混在其中(不知道什么原因),加上后面一句后就能删除这些系统表了


3.
获取所有字段名:
(1)
Select Name FROM SysColumns Where id=Object_Id(''TableName'')

(2)SELECT syscolumns.name,systypes.name,syscolumns.isnullable,syscolumns.length FROM syscolumns, systypes WHERE syscolumns.xusertype = systypes.xusertype AND "syscolumns.id = object_id(''tableName'')

       注意点:
    
a)这里为了重点突出某些重要内容,选取了其中几项信息输出。
    
bsyscolumns表中只含有数据类型编号,要获取完整的名字需要从systypes表中找,一般用户使用的数据类型用xusertype对应比较好,不会出现一对多的情况。
    
csyscolumns.length得到的是物理内存的长度,所以nvarcharvarchar等类型在数据库中的显示是这个的一半。

4、得到表中主键所包含的列名:

    SELECT syscolumns.name FROM syscolumns,sysobjects,sysindexes,sysindexkeys WHERE syscolumns.id = object_id(''tablename'') AND sysobjects.xtype = ''PK'' AND sysobjects.parent_obj = syscolumns.id AND sysindexes.id = syscolumns.id AND sysobjects.name = sysindexes.name AND sysindexkeys.id = syscolumns.id AND sysindexkeys.indid = sysindexes.indid AND syscolumns.colid = sysindexkeys.colid

注意:这是在4张系统表中寻找的,关系比较复杂,大致可以表示为:
syscolumns
中存有表中的列信息和表idsysobjects表中存有主键名字(即PK_Table类似)和表idsysindexes中存 有主键名字和表idindex编号,sysindexkeys中存有表idindex编号和列编号,一项一项对应起来后就能找到列名了。


 回到顶部
美女呀,离线,留言给我吧!
yangming
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/9/1 9:23:00 [只看该作者]

以下是引用qtcks在2009-9-1 8:05:00的发言:

1.获取所有数据库名:
   (1)
Select Name FROM Master..SysDatabases order by Name
2.
获取所有表名:
   (1)Select Name FROM SysObjects Where XType=''U'' orDER BY Name
           XType=''U'':
表示所有用户表;
           XType=''S'':
表示所有系统表;

   (2)SELECT name FROM sysobjects WHERE type = ''U'' AND sysstat = ''83''

           注意:一般情况只需要type = ''U'',但有时候会有系统表混在其中(不知道什么原因),加上后面一句后就能删除这些系统表了


3.
获取所有字段名:
(1)
Select Name FROM SysColumns Where id=Object_Id(''TableName'')

(2)SELECT syscolumns.name,systypes.name,syscolumns.isnullable,syscolumns.length FROM syscolumns, systypes WHERE syscolumns.xusertype = systypes.xusertype AND "syscolumns.id = object_id(''tableName'')

       注意点:
    
a)这里为了重点突出某些重要内容,选取了其中几项信息输出。
    
bsyscolumns表中只含有数据类型编号,要获取完整的名字需要从systypes表中找,一般用户使用的数据类型用xusertype对应比较好,不会出现一对多的情况。
    
csyscolumns.length得到的是物理内存的长度,所以nvarcharvarchar等类型在数据库中的显示是这个的一半。

4、得到表中主键所包含的列名:

    SELECT syscolumns.name FROM syscolumns,sysobjects,sysindexes,sysindexkeys WHERE syscolumns.id = object_id(''tablename'') AND sysobjects.xtype = ''PK'' AND sysobjects.parent_obj = syscolumns.id AND sysindexes.id = syscolumns.id AND sysobjects.name = sysindexes.name AND
sysindexkeys.id = syscolumns.id AND sysindexkeys.indid = sysindexes.indid AND syscolumns.colid = sysindexkeys.colid

注意:这是在4张系统表中寻找的,关系比较复杂,大致可以表示为:
syscolumns
中存有表中的列信息和表idsysobjects表中存有主键名字(即PK_Table类似)和表idsysindexes中存 有主键名字和表idindex编号,sysindexkeys中存有表idindex编号和列编号,一项一项对应起来后就能找到列名了。

学习,顶!


 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/9/1 9:24:00 [只看该作者]

以下是引用hnaysx在2009-9-1 8:13:00的发言:

让老六提供一个根据外部数据源的名称获取其里边的表的名称的方法函数之类的,很简单,因为FOXTABLE本身就有这样的功能,仅仅提供给用户编码而已

希望的就是这样,请老六考虑一下。


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/9/1 9:44:00 [只看该作者]

No

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/9/1 9:44:00 [只看该作者]

二楼的方法仅在sql数据库中有效,它是读取的系统表,局限很大。
我需要的是对任意类型的数据库,都可以得到全部的表名称,比如sql、access、excel等等。请老六考虑一下。。

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/9/1 9:49:00 [只看该作者]

以下是引用狐狸爸爸在2009-9-1 9:44:00的发言:
No

为什么不可以呢?这在数据库系统中很常用的,比如,当导入外部数据库时,对外部数据库的有效性判断等等,都是很有必要的。
我现在的项目中就用到了:用户的外部数据可能是access的,也可能是excel的,表名称也不固定,我在将外部数据导入到系统之前,就必须做个功能,对每个表所包含的字段进行判断。如果数据表结构相同,就允许导入;否则就不能导入。
foxtable的导入,我不喜欢,而且无法做灵活的判断。

[此贴子已经被作者于2009-9-1 9:53:52编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/9/1 10:13:00 [只看该作者]

老六已经答应加了,他就是怕把foxtable搞的太复杂。
先谢谢老六了。。。

 回到顶部