Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链接到SQL server视图的MS Access_Sql_Sql Server_Ms Access_Views - Fatal编程技术网

链接到SQL server视图的MS Access

链接到SQL server视图的MS Access,sql,sql-server,ms-access,views,Sql,Sql Server,Ms Access,Views,我们升级到使用SQL Server作为其数据存储的access数据库存在问题 这个特定的数据库链接到2个sql数据库,所以我认为为了简化事情,我们在主数据库中有一个视图,它链接到辅助数据库中的每个表。这样,access只需要直接与一个SQL数据库通信 当我们将访问链接到数据库视图时,我们选择哪些字段是主键,这样视图就不是只读的。我们有一个标准代码,当数据库打开以获取任何更改时,会刷新所有链接,并且由于主键信息丢失,链接视图变成只读 有没有办法在保留主键信息的同时刷新视图链接 John将访问表重新

我们升级到使用SQL Server作为其数据存储的access数据库存在问题

这个特定的数据库链接到2个sql数据库,所以我认为为了简化事情,我们在主数据库中有一个视图,它链接到辅助数据库中的每个表。这样,access只需要直接与一个SQL数据库通信

当我们将访问链接到数据库视图时,我们选择哪些字段是主键,这样视图就不是只读的。我们有一个标准代码,当数据库打开以获取任何更改时,会刷新所有链接,并且由于主键信息丢失,链接视图变成只读

有没有办法在保留主键信息的同时刷新视图链接


John

将访问表重新链接到SQL server的大量无DSN代码通常先删除链接,然后重新创建链接。然后,代码设置连接字符串。因此,正是删除导致您丢失主键的内容

实际上,我建议您修改重新链接代码,以免删除表链接

尝试以下方法:

For Each tdfCurrent In dbCurrent.TableDefs
   If Len(tdfCurrent.Connect) > 0 Then
      If Left$(tdfCurrent.Connect, 5) = "ODBC;" Then
         strCon = "ODBC;DRIVER={sql server};" & _
           "SERVER=" & ServerName & ";" & _
           "DATABASE=" & DatabaseName & ";" & _
           "UID=" & UserID & ";" & _
           "PWD=" & USERpw & ";" & _
           "APP=Microsoft Office 2003;" & _
           "WSID=" & WSID & ";"
        End If
     End If
     tdfCurrent.Connect = strCon
     tdfCurrent.RefreshLink
  End If
Next tdfCurrent

我在下面包含了我的整个ODBC重新连接功能。这个函数的前提是我有一个名为rtblODBC的表,它存储了重新连接所需的所有信息。如果实现此函数,则无需担心连接到多个SQL数据库,因为每个要重新连接的表都有自己的连接字符串,因此可以顺利地处理这一问题

当您接近尾声时,您将看到我使用DAO用db重新创建主键。用primary执行“CREATE INDEX”&sPrimaryKeyName&“ON”&sLocalTableName&“(&sPrimaryKeyField&”)

如果你有任何问题,请提问

Public Function fnReconnectODBC( _
    Optional bForceReconnect As Boolean _
    ) As Boolean
    ' Comments  :
    ' Parameters: bForceReconnect -
    ' Returns   : Boolean -
    ' Modified  :
    ' --------------------------------------------------'

    On Error GoTo Err_fnReconnectODBC

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim tdf As DAO.TableDef
    Dim sPrimaryKeyName As String
    Dim sPrimaryKeyField As String
    Dim sLocalTableName As String
    Dim strConnect As String
    Dim varRet As Variant

    Dim con As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim sSQL As String

    If IsMissing(bForceReconnect) Then

        bForceReconnect = False

    End If

    sSQL = "SELECT rtblODBC.LocalTableName, MSysObjects.Name, MSysObjects.ForeignName, rtblODBC.SourceTableName, MSysObjects.Connect, rtblODBC.ConnectString " _
         & "FROM MSysObjects RIGHT JOIN rtblODBC ON MSysObjects.Name = rtblODBC.LocalTableName " _
         & "WHERE (((rtblODBC.ConnectString)<>'ODBC;' & [Connect]));"

    Set con = Access.CurrentProject.Connection
    Set rst = New ADODB.Recordset

    rst.Open sSQL, con, adOpenDynamic, adLockOptimistic

        'Test the recordset to see if any tables in rtblODBC (needed tables) are missing from the MSysObjects (actual tables)
        If rst.BOF And rst.EOF And bForceReconnect = False Then

            'No missing tables identified
            fnReconnectODBC = True

        Else

            'Table returned information, we don't have a perfect match, time to relink
            Set db = CurrentDb
            Set rs = db.OpenRecordset("rtblODBC", dbOpenSnapshot)

                'For each table definition in the database collection of tables
                For Each tdf In db.TableDefs

                    'Set strConnect variable to table connection string
                    strConnect = tdf.Connect

                    If Len(strConnect) > 0 And Left(tdf.Name, 1) <> "~" Then

                        If Left(strConnect, 4) = "ODBC" Then

                            'If there is a connection string, and it's not a temp table, and it IS an odbc table
                            'Delete the table
                            DoCmd.DeleteObject acTable, tdf.Name

                        End If

                    End If

                Next

                'Relink tables from rtblODBC
                With rs

                    .MoveFirst

                    Do While Not .EOF

                        Set tdf = db.CreateTableDef(!localtablename, dbAttachSavePWD, !SourceTableName, !ConnectString)

                        varRet = SysCmd(acSysCmdSetStatus, "Relinking '" & !SourceTableName & "'")

                        db.TableDefs.Append tdf
                        db.TableDefs.Refresh

                        If Len(!PrimaryKeyName & "") > 0 And Len(!PrimaryKeyField & "") > 0 Then

                            sPrimaryKeyName = !PrimaryKeyName
                            sPrimaryKeyField = !PrimaryKeyField
                            sLocalTableName = !localtablename

                            db.Execute "CREATE INDEX " & sPrimaryKeyName & " ON " & sLocalTableName & "(" & sPrimaryKeyField & ")WITH PRIMARY;"

                        End If

                        db.TableDefs.Refresh

                        .MoveNext

                    Loop

                End With

            subTurnOffSubDataSheets

            fnReconnectODBC = True

        End If

    rst.Close
    Set rst = Nothing

    con.Close
    Set con = Nothing


Exit_fnReconnectODBC:

    Set tdf = Nothing
    Set rs = Nothing
    Set db = Nothing

    varRet = SysCmd(acSysCmdClearStatus)

    Exit Function

Err_fnReconnectODBC:

    fnReconnectODBC = False

    sPrompt = "Press OK to continue."
    vbMsg = MsgBox(sPrompt, vbOKOnly, "Error Reconnecting")
    If vbMsg = vbOK Then

        Resume Exit_fnReconnectODBC

    End If

End Function
dbc的公共功能(_
可选bForceReconnect作为布尔值_
)作为布尔值
评论:
'参数:bForceReconnect-
'返回值:布尔值-
“修改:
' --------------------------------------------------'
On Error GoTo Err_FNC
Dim数据库作为DAO.Database
Dim rs作为DAO.Recordset
将tdf调暗为DAO.TableDef
将MaryKeyName设置为字符串
模糊的玛丽凯菲尔德作为字符串
Dim sLocalTableName作为字符串
作为字符串的Dim strConnect
Dim varRet作为变体
Dim con作为ADODB连接
将rst设置为ADODB.Recordset
将sSQL设置为字符串
如果IsMissing(b ForcereConnect)则
bForceReconnect=False
如果结束
sSQL=“选择rtblODBC.LocalTableName、MSysObjects.Name、MSysObjects.foreigname、rtblODBC.SourceTableName、MSysObjects.Connect、rtblODBC.ConnectString”_
&“从MSysObjects右键连接MSysObjects上的rtblODBC.Name=rtblODBC.LocalTableName”_
&其中(((rtblODBC.ConnectString)'ODBC;'&[Connect])
设置con=Access.CurrentProject.Connection
Set rst=New ADODB.Recordset
rst.打开sSQL、con、adOpenDynamic、ADLOCK
'测试记录集,查看MSysObjects(实际表)中是否缺少rtblODBC中的任何表(所需表)
如果rst.BOF和rst.EOF以及bForceReconnect=False,则
“没有发现丢失的表格
FnReconnectDBC=True
其他的
“表返回了信息,我们没有完美的匹配,是时候重新链接了。”
Set db=CurrentDb
Set rs=db.OpenRecordset(“rtblODBC”,dbOpenSnapshot)
'对于数据库表集合中的每个表定义
对于以db.TableDefs为单位的每个tdf
'将strConnect变量设置为表连接字符串
strConnect=tdf.Connect
如果Len(strConnect)>0并向左(tdf.Name,1)“~”则
如果左(strConnect,4)=“ODBC”,则
'如果有一个连接字符串,它不是临时表,而是odbc表
'删除该表
DoCmd.DeleteObject可执行,tdf.Name
如果结束
如果结束
下一个
'从rtblODBC重新链接表
用rs
.先走一步
做而不做
Set tdf=db.CreateTableDef(!localtablename,dbAttachSavePWD,!SourceTableName,!ConnectString)
varRet=SysCmd(acSysCmdSetStatus,“重新链接”&!SourceTableName&“”)
db.TableDefs.Append tdf
db.TableDefs.Refresh
如果Len(!PrimaryKeyName&“”)大于0且Len(!PrimaryKeyField&“”)大于0,则
sPrimaryKeyName=!主键名
斯普丽凯菲尔德=!主键场
sLocalTableName=!本地表名
db.使用主命令执行“创建索引”&sPrimaryKeyName&“ON”&sLocalTableName&“(&sprimarykeynield&”)
如果结束
db.TableDefs.Refresh
.下一步
环
以
子TurnOffSubDataSheet
FnReconnectDBC=True
如果结束
rst.关闭
设置rst=无
结案
设置con=Nothing
退出DBC:
设置tdf=无
设置rs=无
Set db=Nothing
varRet=SysCmd(acSysCmdClearStatus)
退出功能
Err_fn重新连接DBC:
FNConReconstrectDBC=False
sPrompt=“按“确定”继续。”
vbMsg=MsgBox(sPrompt、vbOKOnly,“错误重新连接”)
如果vbMsg=vbOK,则
恢复退出数据库
如果结束
端函数

这对我来说效果更好一些(注意移动端if's):


ODBC检查是正确的,即使“ODBC;”部分没有显示在MSysObjects视图中

如何刷新链接?另外-数据库结构(在sql server中)是否更改
Dim dbCurrent As Database
Set dbCurrent = CurrentDb()

StatusList.SetFocus
StatusList.AddItem ("starting... ")
I = DoEvents()
Dim tdfCurrent As DAO.TableDef
For Each tdfCurrent In dbCurrent.TableDefs
   If Len(tdfCurrent.Connect) > 0 Then
      If Left$(tdfCurrent.Connect, 5) = "ODBC;" Then
         strCon = "ODBC;DRIVER={sql server};" & _
           "SERVER=" & ServerName & ";" & _
           "DATABASE=" & DatabaseName & ";" & _
           "UID=" & UserID & ";" & _
           "PWD=" & USERpw & ";" & _
           "APP=Microsoft Office 2003;" & _
           "WSID=" & WSID & ";"

           StatusList.AddItem ("fixing " & tdfCurrent.Name)
        tdfCurrent.Connect = strCon
        tdfCurrent.RefreshLink
     End If
  End If
  I = DoEvents()
Next tdfCurrent

  StatusList.AddItem ("----Done.")