【问题标题】:VBA empty string for insert into SQL Server用于插入 SQL Server 的 VBA 空字符串
【发布时间】:2015-06-22 22:58:15
【问题描述】:

情况如下: 有一个带有 Microsoft Access 前端的 SQL Server 数据库。 SQL Server 数据库中有一个表,其中有一个名为 PackID 的列,该列定义为 VARCHAR(6) NOT NULL(它必须为 NOT NULL,因为它是该表的复合主键的一部分)。 PackID 列中的空字符串是合法的。事实上,它们经常发生。当用户在 UI 中为此表输入数据并通过 PackID 字段进行选项卡时,会出现一条错误消息:“无法将值 NULL 插入列 'PackID';列不允许空值。插入失败。”

尝试过但不起作用的方法:

  1. 在 SQL Server 数据库中的该列上添加一个默认约束,其值为 '' - 显然,只有在 INSERT 语句中省略该列时才使用默认值
  2. 将 Access 中 PackID 字段的默认值设置为“” - 它的行为就像“”为 NULL 一样
  3. 当用户在 UI 中移出行时调用以下 VBA 代码(丢失焦点事件)

    If IsNull(PackID.Value) Then
       PackID.Value = ""
    End If
    

有谁知道如何在 Access 中强制使用空字符串,以便将其解释为 SQL Server 的空字符串而不是 NULL?

【问题讨论】:

  • IsNull(ComponentPackID.Value) 行是否返回 True?
  • 这可能是 Access 中的一件事,让您的生活“更容易”为空字符串发送 NULL,因为在糟糕的旧 VBA 时代,没有处理 NULL 值的好方法。这很 hacky,但是一个空格怎么样,然后在进入的过程中修剪所有内容?
  • 您对 SQL 服务器有任何控制权吗?是否可以在其中放置触发器,以便在插入之前将 NULL 转换为空字符串? (注意:我没有测试过这个,但如果它不是一个选项,那么看看它是否有效是没有意义的。)
  • 如果您更新链接 SQL 表的方式(假设不是 adp 项目),也许会很有用 - SQL Server Native Client ODBC 驱动程序?
  • 检查这个,但没有帮助:bytes.com/topic/access/answers/…

标签: sql-server vba ms-access


【解决方案1】:

在 Access 中为 PackID 的文本框属性设置默认值

=" "

工作。双引号之间的空格非常重要。留出空间会导致插入失败。在 SQL Server LEN(PackID) 中返回 0。例如:

SELECT LEN(''), LEN(' ');

两者都返回 0。SQL Server 似乎将这两个都视为空字符串。

【讨论】:

  • 所以对我来说很清楚:永远不要使用 SQL Server 数据库在 Access 中创建应用程序......遗憾的是,他们在 Access 2013 中放弃了 ADP 支持。
【解决方案2】:

此问题的替代解决方案(PackID 的文本框属性中没有默认值)。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If IsNull(PackID.Value) Or PackID.Value = "" Then
        PackID.Value = " "
    End If
End Sub

这仍然使用传递 SQL Server 的概念“”(读作引号空格引号)作为字段的值。在 UI 方面,这是为字段设置默认值的替代方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2011-01-04
    • 1970-01-01
    • 2012-03-21
    • 2011-08-02
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多