Foxtable(狐表)用户栏目专家坐堂 → [讨论] 关于外部数据源问题,如何解决?


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

主题:[讨论] 关于外部数据源问题,如何解决?

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
[讨论] 关于外部数据源问题,如何解决?  发帖心情 Post By:2008/12/11 13:14:00 [显示全部帖子]

计划中应用程序的操作顺序是这样的:
1、用户进入项目文件
2、在内部表中选择备选的会计软件各类和版本,并按提示设置要连接的数据源,如SQL、.MDB、.DBF、.TXT等(后面两个好解决,不是问题)
3、根据这个会计软件名称、版本号和设置的数据源,开发者用if、
QueryBuilder、SQLCommand取得查询表并计算它们,再用数据填充将它们引入到内部表中。
这样可以实现提取会计软件数据库中有用信息的任务。





可是现在,BeforeConnectOuterDataSource 在事件中设置的连接字符串只是在打开项目准备连接外部数据源时执行,这时内部表没有加载,无法知道用户设置的信息,开发者怎未卜先知用户想连接那种数据库呢?
我想了一个变通的方法:先让用户进入项目,设置数据源信息,这时系统会自动重新打开项目并连接外部数据源,可是在重新连接的过程中卸载了内部表中设置好了的会计软件各类和版本信息,开发者又如何能运用if、
QueryBuilder、SQLCommand取得想要的查询表呢?要知道每一种软件的表名和字段不可能一样的,针对每一种会计软件都有不同的QueryBuilder、SQLCommand。----可见这是行不通的。

所以建议:
1、准许进入项目时,不连接任何的外部数据源(不论用户身份),当然也不加载外部数据表,这个只要在
BeforeConnectOuterDataSource事件中加一个属性就可以了;

2、准许在项目打开的情况下按开发者设置的连接字符串重新加载外部数据源(只有内部数据表),当然如果已经连接了外部数据源的话,这个是不执行的(这样做的难度可能比较大),这个是与1配套的。

3、注意,2中的连接字符串不是在BeforeConnectOuterDataSource事件中设置的,而是将连接字符串写在某个控件的事件中(比如按键),因为:开发者不能未卜先知用户想要的数据库种类和地址,这些信息只有通过项目中的窗口信息取得。

不知还有没有其他的解决方法能达到本贴提出的“顺序”问题,请老大和版主大家来讨论一下这个。

[此贴子已经被作者于2008-12-11 16:26:04编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2008/12/11 14:54:00 [显示全部帖子]

1、对于数据库文件的名称,开发者是不能固定的不能预先写入,地址也是很多变的(也不一定在项目目录中,一般在会计电脑的安装目录中),所以扩展属性仍不易应用。
2、对于SQL等大型数据库,开发者也是不能固定IP地址的,因为会计服务器的地址只有到了审计现场才能确定,所以也不好办啊!

我想了一个办法,不知能行通否:
1、在项目程序中预先设置一个备用的数据源,固定名称,如“会计数据库”,以便于打开项目时正常连接不出现提示,但实质上这个数据源连接的数据是不会使用的;
2、审计员根据现场情况确定要连接的数据库,并修改名为“会计数据库”的数据源,但不设置要查询的表,修改完成以后项目程序会自动重新打开;
3、项目打开后,证明数据源正确连接了,再运用if、QueryBuilder、SQLCommand来查询并运算需要的表;

这样好像可以解决问题,但是也有问题的:
1、项目总是保存上一次的数据源信息,换了一个企业以后就不能正确连接了,还是老出现提示。
2、当有工作组信息文件(systemdata)要加载时,在生成器里面是无法设置的,我只有提示用户在字符串窗口中手工干预了,比如复制一串固定的字符,如此才能正确连接,这样太不友好了。

然道真的没有解决之法吗?



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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2008/12/11 14:58:00 [显示全部帖子]

关键是这些属性只能在BeforeConnectOuterDataSource事件中,不能在重新连接外部数据源时(不关内部数据表时)设置。

e参数属性:

Name:             外部数据源名称
User:             登录用户
ProjectFile:      项目文件名,含路径。
ProjectPath:      返回项目文件所在目录
ConnectionString: 返回或设置连接字符串。


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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2008/12/11 15:16:00 [显示全部帖子]

哈哈,接受建议。


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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2008/12/11 16:25:00 [显示全部帖子]

老大,扩展属性也是开发者先行设置好的,开发者是不知道现场需要连接的数据库名称和地址的,如何办?

我的应用程序是需要用户来设置数据源的,我只是根据不同的数据库来查询、提取有用的数据,如此而已。

归根到底是加载外部数据源的顺序问题,一定得在打开项目文件时加载,不能选择取消,也不能在不关闭内部表的情况下加载吗?

老大可能不理解为什么要这样,我想我在一楼的帖子中已经说得很明白了,可能是字小了看不清!


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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2008/12/11 17:15:00 [显示全部帖子]

用户一天换一个数据源,数据源的地址都不在项目目录中。设置这个还有什么意义?这个扩展属性适用于相对固定、有限选择的情况。

如果频繁地变化数据源名称和地址,而且不是有限范围内选择不同的数据源和地址,不如手工设置数据源哦。


帮助中的那个我看过多遍。
[此贴子已经被作者于2008-12-11 17:23:57编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2008/12/11 18:01:00 [显示全部帖子]

老大的意思是用扩展属性设置连接字符串中的所有信息,一段段地设置?

全部手工输入?而且是在项目打开的时候?

这样用户使用时是很有难度的,他们基本没有数据库的概念,需要在使用过程中提示,比如什么会计软件的数据库名可能是什么样的、可能存在哪里、一个数据库里有几个年度的账、数据库密码可能是什么、系统数据库可能在哪里名称是什么等等。

何况数据库和软件版本太多,难以组合成需要的连接字符串的。

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2008/12/11 19:42:00 [显示全部帖子]

是的啊!

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2008/12/12 22:06:00 [显示全部帖子]

谢谢,学习了

其实SQL里有很多东西我们还不熟悉,比如你说到的返回所有的数据库名 和 所有的数据表名。

狐表会根据不同的数据源支持不同的SQL查询语言,所以在使用时,对于ACCESS与sqL会有点不同。

可是,现在我的问题是____灵活地连接不同结构的数据库,比如:sql  .mdb  oracle 等等,具体指连接字符串生成器中的所有数据库。

所谓灵活地连接,指打开项目时先不连接任何数据库,在不关闭内部表的情况下,根据用户要求,使用代码合成连接字符串加载不同结构的数据库。

说到底这是启动顺序的问题,这个问题比较特殊,目前狐表还不能在先加载了内部表以后再连接外部数据源,可我得根据用户的窗口选择来合成连接字符串(或打开生成器)。

至于要查询各种数据库中的什么表、什么字段、用什么条件,我心中有数,不过有了 gdtgl  的这两个返回所有的数据库名 和 所有的数据表名的例子,我分析数据库的速度快很多!

老大说要在一个项目中根据用户要求自由选择加载各种结构不同的数据库,不太现实,这个是特例。可我觉得既然狐表建立在.NET2.0的基础上,这个是没有问题的。目前我正在用的项目文件就是同时加载了两种数据库,运行良好!

不过,老大提了一个解决方案__用多个项目文件来连接不同结构的数据库,毕竟主流的数据库不是很多!这样也算是一个方法但生硬了一些,不太专业。

 回到顶部