以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]能否实现动态数据源的设置??  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=32695)

--  作者:智友软件工作室
--  发布时间:2013/5/6 18:58:00
--  [求助]能否实现动态数据源的设置??
请教高手们一个问题,数据源是再项目里面直接设置的。我先在有一个问题假如我有两个sql数据库,数据库中的表结构相同。分别为数据库A和数据库B。
能否实现当用户A登录的时候外部数据源直接链接到数据库A,用户B登录的时候直接链接到数据库B。
不知道这样能否实现,狐表支持吗?

--  作者:jianjingmaoyi
--  发布时间:2013/5/6 19:14:00
--  
肯定
--  作者:teng0731
--  发布时间:2013/5/6 19:17:00
--  

BeforeConnectOuterDataSource

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

e参数属性:

Name:             外部数据源名称
User:             登录用户
ProjectFile:      项目文件名,含路径。
ProjectPath:      返回项目文件所在目录
ConnectionString: 返回或设置连接字符串。
HideSplashForm:  逻辑型,设为True,关闭Foxtable的启动封面。

有两点要注意:

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

e参数方法:

EditConnectionString:手工连接数据源。

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

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

注意此事件必须通过e.User来引用用户。

示例一

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

If e.name = "成绩" Then
    e.C & e.ProjectPath &
"成绩数据.mdb;Persist Security Info=False"
End
if

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

If e.name = "成绩" Then
    e.C & e.ProjectPath &
"成绩数据.mdb;Persist Security Info=False"
End
if

如果有多个数据源,可以:

If e.name = "数据源1" Then
    e.C & e.ProjectPath &
"数据文件1.mdb;Persist Security Info=False"
ElseIf e.name = "数据源2" Then
    e.C & e.ProjectPath &
"数据文件2.mdb;Persist Security Info=False"
End
if

示例二

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

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

If e.name = "连接名称" Then
    e.C & 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.Jet.OLEDB.4.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

示例五

假定有两个IP地址(也可能是两个服务器),分别是192.168.1.100和119.75.217.56,默认使用第一个IP地址,如果第一个IP地址无法接通,则自动切换到第二个IP地址。
要实现这个功能很简单,首先在设置数据源的时候,使用第一个IP地址(192.168.1.100)设置,然后在BeforeConnectOuterDataSource事件中设置如下代码:

If e.Name = "数据源名称" Then
    If Network.Ping("192.168.1.100",1000) = False  Then \'如果第一个IP无法接通
        e.ConnectionString = e.ConnectionString.Replace("192.168.1.100", "119.75.217.56")
    End If
End If

示例六

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

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

End
If


--  作者:智友软件工作室
--  发布时间:2013/5/9 20:33:00
--  
这个是内置的用户登录可以实现我看过了,我现在是自己坐的登录窗口,在链接数据源之前,窗口还没有生成吧。那么我该如何做呢?
--  作者:jianjingmaoyi
--  发布时间:2013/5/9 21:32:00
--  

Connections

一般用户可以忽略本节内容,因为很少需要通过代码来管理数据源的。

Connections表示数据源集合,可以获得指定名称的数据源

示例

Dim cn As Connection
cn =  Connections("test"
)

Connections的属性和方法有:

Add

增加数据源

语法:

Add(Name, ConnectionString)

Name:       新增数据源的名称。
ConnectionString:新增数据源的链接字符串。

例如:

Connections.Add("test","Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\abc.mdb;Persist Security Info=False")

Delete

删除指定名称的数据源

语法:

Delete(Name)

Name:   要删除的数据源名称。

TryConnect

测试指定的链接字符串能否连通,如果能连通,则返回True,否则返回False。

语法:

TryConnect(ConnectionString)

ConnectionString:要测试的链接字符串。

Dim s As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\data\\Northwind.mdb;Persist Security Info=False"
If
Connections.TryConnect(s) = False Then
    MessageBox.Show("数据源无法连通!"
)
End If

Contains

判断是否存在指定名称的数据源,如果存在,就返回True。

语法:

Contains(Name)

Name:   数据源名称。

Count

返回数据源的数量。


--  作者:狐狸爸爸
--  发布时间:2013/5/11 8:47:00
--  
以下是引用智友软件工作室在2013-5-9 20:33:00的发言:
这个是内置的用户登录可以实现我看过了,我现在是自己坐的登录窗口,在链接数据源之前,窗口还没有生成吧。那么我该如何做呢?

 

2013版,内置的用户管理,登陆窗口可以自定义,用户数据表可以来自外部数据库,没有必要自己写了:

 

http://www.foxtable.com/help/topics/2723.htm

http://www.foxtable.com/help/topics/2729.htm