从 Access 插入/更新链接的 SQL Server 表

Posted

技术标签:

【中文标题】从 Access 插入/更新链接的 SQL Server 表【英文标题】:Insert/Update linked SQL Server Tables from Access 【发布时间】:2014-06-17 22:56:46 【问题描述】:

是否可以从 Access 前端向 SQL Server 表中插入/更新数据?如果有怎么办?

我在 access db 中有一个链接的 sql server 表,我想使用未绑定的访问表单对其进行更新,最好的方法是什么?

【问题讨论】:

您是否具有通过UPDATE 字符串更新所需的权限?此应用程序是否将发布给最终用户?如果是,我希望上述答案要么是“否”,要么是最终用户不会。根据更新的复杂性,我可能会选择调用存储过程。 @Simon1979 是的,我确实拥有所需的权限。一旦我点击 ACCESS 表单上的 Submit 按钮,我就会看到 SQL Server 表中的数据。但是当我关闭 ACCESS 数据库时,我更新的数据被删除了。这个应用程序的用途非常有限,直到我们找到更好的解决方案。这是临时修复。您将如何使用存储过程从访问中更新/插入链接的 sql server 表? 【参考方案1】:

不知道为什么它会在退出数据库时删除,除非它没有提交事务,但不确定你将如何实际执行此操作,可能是表的连接字符串中的某些内容。

一个非常简单的存储过程路由如下所示:

创建您的存储过程:

CREATE PROCEDURE usp_SimpleUpdateExample 
    -- Add the parameters for the stored procedure here
    @NewValue int,
    @WhereCriteria1 int,
    @WhereCriteria2 varchar(10),
    @Ret int OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
BEGIN TRY
    BEGIN TRANSACTION
        UPDATE tbl_YourTable
        SET UpdatedField = @NewValue
        WHERE FirstCriteriaField = @WhereCriteria1 
                And SecondCriteriaField = @WhereCriteria2

        SET @Ret = @@ROWCOUNT

        COMMIT TRANSACTION

END TRY
BEGIN CATCH
    IF @@trancount > 0 ROLLBACK TRANSACTION
    SET @Ret = -1
END CATCH

END

创建一个函数来调用过程:

Function UpdateData(iNewValue As Integer, iCrtieria1 As Integer, _
    strCriteria2 As String) As Long
On Error GoTo Err_Handle


Set cnn = CreateObject("ADODB.Connection")
cnn.ConnectionString = "DRIVER=SQL Server;SERVER=ServerName;" _
    & "DATABASE=DatabaseName;Trusted_Connection=Yes"

cnn.Open cnn.ConnectionString

Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = cnn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "dbo.usp_SimpleUpdateExample"
cmd.CommandTimeout = 0

Set param = cmd.CreateParameter("@NewValue", adInteger, _
    adParamInput, , iNewValue)
cmd.Parameters.Append param
Set param = cmd.CreateParameter("@WhereCriteria1", 20, _
    adParamInput, , iCrtieria1)
cmd.Parameters.Append param
Set param = cmd.CreateParameter("@WhereCriteria2", adVarChar, _
    adParamInput, , strCriteria2)
cmd.Parameters.Append param
Set param = cmd.CreateParameter("@Ret", adInteger, adParamOutput)
cmd.Parameters.Append param


cmd.Execute

UpdateData = cmd.Parameters("@Ret")


Exit_Proc:
Set cnn = Nothing
Set cmd = Nothing
Set param = Nothing

Exit Function

Err_Handle:
    ' msgbox with details or whatever error handle you use
    AllocatePymt = -1
    GoTo Exit_Proc
End Function

存储过程(以及函数)返回更新的行数(或使用INSERT 新行数),如果发生错误则返回-1;调用它会是这样的:

l = UpdateData(52,1234,"FooBar")
SelectCase l
Case Is > 0
    msgbox "Updated " & l & " rows"
Case 0
    Msgbox "No rows updated, but no error"
Case Else
    Msgbox "An error occurred, the transaction was rolled back"
End Select

这一切都适用于Access 2007SQL Server 2005,这是我可用的全部。

【讨论】:

以上是关于从 Access 插入/更新链接的 SQL Server 表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 在链接的 MS Access 表上插入后返回不同的记录

Access SQL:从插入语句或从 DAO.QueryDef 获取受影响记录的标识值

使用带有 Azure 链接表的 Access 插入 SQL 失败

更新查询的 MS Access SQL 错误

迁移到新的 SQL Server 后,在 MS Access 中更新链接表的最佳方法是啥?

如何从 SQL Server 读取 MS Access 数据库以更新一个或多个表列中的数据?