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


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

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

帅哥哟,离线,有人找我吗?
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编辑过]

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


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

通过用户扩展属性,让用户在登陆的时候,输入有关设置即可

 回到顶部
帅哥哟,离线,有人找我吗?
wcs
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | 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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | 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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


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

哈哈,接受建议。


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2008/12/11 15:56:00 [只看该作者]

扩展用户属性就是用于输入多变的设置,例如IP地址,而且使用很方便。


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


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

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

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

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

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


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2008/12/11 16:55:00 [只看该作者]

以下是引用wcs在2008-12-11 16:25:00的发言:

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


我确实无法理解,即使数据库名称和地址是变化的,你也可以增加两个扩展用户属性,分别用于输入数据库名称和地址,然后在BeforeConnectOuterDataSource合成连接字符串。你甚至可以在其中执行EditConnectionString方法,让用户利用数据源生成器连接任何格式的数据源。

难道你的版本和我的不同:

BeforeConnectOuterDataSource

这个事件是专业用户才用得着的,普通用户不需要研究它。
准备连接外部数据源的时候执行,可以在此修改连接字符串。

e参数属性:

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

有两点要注意:

FoxTable使用的数据提供程序是OLE DB .NET。
数据源最好是SQL SERVER 或者 ACCESS。

e参数方法:

EditConnectionString:手工连接数据源。

这也是唯一一个带方法的e参数。

利用本事件,可以根据登录用户的不同,通过修改e参数的ConnectionString属性,链接到不同的后台数据库。

示例一

假定有一个成绩管理系统,使用的是一个Access格式的外部数据源,外部数据源的名称为“成绩”,外部数据文件名为"成绩数据.mdb",和项目文件处于同一目录之下。
为了保证这个项目复制到任何目录都能正常链接该外部数据源,可以在
BeforeConnectOuterDataSource事件中加入下面的代码:

If e.name = "成绩" Then
    e.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & e.ProjectPath &
"成绩数据.mdb;Persist Security Info=False"

End
if

这里假定外部数据源的格式2000/2003,如果是2007,代码为:

If e.name = "成绩" Then
    e.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & e.ProjectPath &
"成绩数据.mdb;Persist Security Info=False"

End
if

示例二

假定你有三个外部数据文件,分别是:2008.MDB、2009.MDB、2010.MDB,希望能够让用户在登录的时候,选择链接这三个数据库之一。
为解决这个问题,可以在用户管理窗口增加一个名为“数据库”的扩展用户属性,将这个扩展属性的候选值设为“|2008|2009|2010”:

然后BeforeConnectOuterDataSource事件中加入下面的代码:

If e.name = "连接名称" Then
    e.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & e.ProjectPath &
e.User.ExtendedValues("数据库") & ".mdb;Persist Security Info=False"
End
if

这样用户在登录的时候,不仅可以从下拉列表中选择数据库,还可以直接输入数据库名称。

示例三

如果希望能够在打开项目的时候,自动出现一个对话框,让用户随意选择外输数据文件链接,可以BeforeConnectOuterDataSource事件中加入下面的代码:

If e.Name = "连接名称" Then
    Dim
dlg As New OpenFileDialog
    dlg.Filter=
"Access文件|*.mdb"
    If dlg.ShowDialog = DialogResult.Ok Then
        e.ConnectionString =
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dlg.FileName & ";Persist Security Info=False"
    End
If
End
if

 

示例四

假定有一个名为“销售数据”远程数据源,默认的IP地址为119.119.120.120,因为服务器的调整,IP地址可能会发生变化,导致数据源无法连接。
为解决这个问题,可以在用户管理窗口增加一个名为IP的扩展用户属性,让用户在登录的时候,可以输入另一个IP地址,
然后BeforeConnectOuterDataSource事件中加入下面的代码:

If e.Name = "销售数据" Then
    Dim
IP As String = e.User.ExtendedValues("IP") '获得用户输入的IP
   
If IP > "" '如果用户自己输入了IP
        '则用用户输入的IP替换原来的IP

        e.ConnectionString = e.ConnectionString.Replace(
"119.119.120.120", IP)
    End
If
End
If

你也可以用另一种方法解决,在项目文件目录下创建一个ip.txt的文本文件,在该文件中输入最新的IP地址,并在BeforeConnectOuterDataSource事件中设置如下代码:

Dim ipFile As String = e.ProjectPath & "ip.txt"
If
e.Name = "销售数据" Then
    If
Filesys.FileExists(ipFile) Then
        Dim
ip As String = FileSys.ReadAllText(ipFile)
        e.ConnectionString = e.ConnectionString.Replace("119.119.120.120",ip)
    End
If

End
If

示例五

你也可以在连接某一数据源之前,执行方法EditConnectionString,让用户手工设置连接字符串。
例如你希望在连接“销售数据”的时候,如果登录用户为开发者,则显示数据连接窗口,让用户手动选择外部数据源:

If e.User.Type = UserTypeEnum.Developer Then
    e.EditConnectionString()

End
If



 

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

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


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

扩展属性名称是开发者定义的,但是内容是用户输入的。


 回到顶部
帅哥哟,离线,有人找我吗?
wcs
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | 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编辑过]

 回到顶部
总数 17 1 2 下一页