从Access表单调用SQL Server函数

时间:2015-04-16 16:40:07

标签: sql-server function ms-access

我正在寻找在Access前端使用SQL Server功能的正确方法。单向使用它相当简单 - 只需要调用函数,使用括号和瞧 - 就绪。但是我坚持另一个案子。如果有两个独立的功能,则为whtt:一个到#34;代码"第二个到"解码"数据?问题的背景可以在这里找到:Datatype for storing ip address in SQL Server。我想在我的访问应用程序中使用此示例,但如何在MS Access表单中执行两个单独的单向操作?当然,如果需要创建额外的视图或任何额外的层来实现这一点,除了创建一个表单,我不是很顽固,只是有点懒惰 - 我很乐意这样做。

2 个答案:

答案 0 :(得分:2)

您所描述的内容确实可以通过绑定到ODBC链接表的Access表单来完成。您需要做的是在表单上创建两个控件

  1. 绑定到链接表中字段的隐藏控件,
  2. 用户可以与之交互的可见未绑定控件。
  3. 例如,假设您有一个名为[dbo_temperatures]的ODBC链接表,该表指向以Celsius存储温度值的SQL Server表:

    -- (code to create the table in SQL Server Management Studio)
    CREATE TABLE dbo.temperatures (
        id INT IDENTITY PRIMARY KEY, 
        observed DATETIME, 
        tempC INT)
    

    SQL Server中还有两个标量函数可以将值从摄氏度转换为华氏度,反之亦然

    CREATE FUNCTION dbo.fnCtoF(@tempC AS INT) RETURNS INT
    AS
    BEGIN
        DECLARE @t AS FLOAT;
        SET @t = CONVERT(FLOAT, @tempC);
        RETURN CONVERT(INT, (@t * 9 / 5) + 32);
    END
    

    CREATE FUNCTION dbo.fnFtoC(@tempF AS INT) RETURNS INT
    AS
    BEGIN
        DECLARE @t AS FLOAT;
        SET @t = CONVERT(FLOAT, @tempF);
        RETURN CONVERT(INT, (@t - 32) * 5 / 9);
    END
    

    在您的表单上(绑定到链接表[dbo_temperatures]),您创建

    1. 一个名为" txtTempC"的隐藏文本框绑定到[tempC]字段和
    2. 一个名为" txtTempF"。
    3. 的可见未绑定文本框

      表单有两个私有VBA函数来调用SQL Server函数

      Private Function getFahrenheit(t As Variant) As Variant
          If IsNull(t) Then
              getFahrenheit = Null
          Else
              Dim cdb As DAO.Database, qdf As DAO.QueryDef, rst As DAO.Recordset
              Set cdb = CurrentDb
              Set qdf = cdb.CreateQueryDef("")
              qdf.Connect = cdb.TableDefs("dbo_temperatures").Connect
              qdf.SQL = "SELECT dbo.fnCtoF(" & t & ") AS x"
              qdf.ReturnsRecords = True
              Set rst = qdf.OpenRecordset(dbOpenSnapshot)
              getFahrenheit = rst!x
              rst.Close
              Set rst = Nothing
              Set qdf = Nothing
              Set cdb = Nothing
          End If
      End Function
      

      Private Function getCelsius(t As Variant) As Variant
          If IsNull(t) Then
              getCelsius = Null
          Else
              Dim cdb As DAO.Database, qdf As DAO.QueryDef, rst As DAO.Recordset
              Set cdb = CurrentDb
              Set qdf = cdb.CreateQueryDef("")
              qdf.Connect = cdb.TableDefs("dbo_temperatures").Connect
              qdf.SQL = "SELECT dbo.fnFtoC(" & t & ") AS x"
              qdf.ReturnsRecords = True
              Set rst = qdf.OpenRecordset(dbOpenSnapshot)
              getCelsius = rst!x
              rst.Close
              Set rst = Nothing
              Set qdf = Nothing
              Set cdb = Nothing
          End If
      End Function
      

      然后,您可以使用表单的On Current事件来填充华氏度文本框

      Private Sub Form_Current()
          Me.txtTempF.Value = getFahrenheit(Me.txtTempC.Value)
      End Sub
      

      和华氏度文本框的After Update事件更新Celsius文本框。

      Private Sub txtTempF_AfterUpdate()
          Me.txtTempC.Value = getCelsius(Me.txtTempF.Value)
      End Sub
      

      由于Celsius文本框绑定到[tempC]字段,因此在保存记录时,更改将写回到表中。

答案 1 :(得分:0)

我假设您想要使用您的函数解码查询中的某些数据,在表单中显示解码数据,在那里编辑它,然后在保存数据的同时使用其他函数对其进行编码。

这在Access中的数据绑定表单中是不可能的。 Access始终尝试将在表单字段中输入的数据直接写入相应的表或查询字段。不可能在两者之间进行任何数据处理(对编码功能的调用)。

实现此目的的一种方法是使用未绑定的表单。 您创建一个未绑定到任何记录源的表单,然后将查询中的数据读入记录集,并将记录集数据写入表单中的控件。要保存数据读取控件的内容,请创建一个调用编码函数的sql update语句,并将数据保存到表中。