【问题标题】:Chinese characters in Access SQL QueryAccess SQL 查询中的汉字
【发布时间】:2021-10-21 04:38:20
【问题描述】:

填充记录源后,下一个操作是单击填充的字段之一以“激活”记录。单击此按钮时,目标是将 SEC_ID(A GUID,数字数据类型)存储为 tempvar 并在以后的查询中使用。此 GUID 也放置在文本框中,仅用于可视化调试。但是它没有放 GUID,它放的是随机的汉字。我试图将它放入 MsgBox 中只是为了也能看到它会吐出“???????”。

我填充行源的代码:

Dim componentListSQL As String
If FCSUtilities.AssessmentUoM = "Metric" Then
    componentListSQL = "SELECT DISTINCT [100b_Working].SEC_SYS_COMP_ID, [100b_Working].SEC_ID, [110b_RO_Material_Category].MAT_CAT_DESC, [110b_RO_Component_Type].COMP_TYPE_DESC, [110b_RO_Material_Category].MAT_CAT_ID, [110b_RO_Component_Type].COMP_TYPE_ID, [100b_Working].ID_Number, [100b_Working].Model, [100b_Working].Serial_Number, [100b_Working].Capacity, [100b_Working].Manufacturer, [100b_Working].SEC_YEAR_BUILT, ROUND([100b_Working].SEC_QTY, 0) AS SEC_QTY, [100b_Working].UOM_MET_UNIT_ABBR, [100b_Working].UOM_ENG_UNIT_ABBR, [100b_Working].Equipment_Make, [100b_Working].UOM_CONV " _
                     & "FROM (110b_RO_Units_Conversion INNER JOIN (110b_RO_Component_Type INNER JOIN (110b_RO_Material_Category INNER JOIN 110b_RO_CMC ON [110b_RO_Material_Category].MAT_CAT_ID = [110b_RO_CMC].CMC_MCAT_LINK) ON [110b_RO_Component_Type].COMP_TYPE_ID = [110b_RO_CMC].CMC_CTYPE_LINK) ON [110b_RO_Units_Conversion].UOM_ID = [110b_RO_CMC].CMC_UoM) INNER JOIN 100b_Working ON [110b_RO_CMC].CMC_ID = [100b_Working].SEC_CMC_LINK " _
                     & "WHERE ((([100b_Working].SEC_SYS_COMP_ID) = [Forms]![200a_MainWindow]![txtDebugCompSysID]) And (([100b_Working].SEC_ID) Is Not Null)) " _
                     & "ORDER BY [110b_RO_Component_Type].COMP_TYPE_DESC;"
                     
    Me![210_ComponentList].Form.RecordSource = componentListSQL
End If

OnClick 事件:

Private Sub txtMaterialCategory_Click()
Me.txtActiveSecID.Value = Me.txtSecID.Value
End Sub

txtSecID 应该显示为 GUID,但它在 txtActiveSecID 中成为中文字符,即使我尝试将其作为 tempvar 然后将其设置为 txtActiveSecID。

我不确定发生了什么。查看不同的堆栈,它指出这是由于 long/memo 字段,但正如我之前所说,SEC_ID 字段数据类型是 Number。

【问题讨论】:

  • 尝试在数据库上运行 Compact & Repair
  • 刚刚试了,没修好。
  • 然后新建一个数据库并导入所有对象。如果这没有帮助,请重新创建表(或至少 GUID 字段)。
  • 您的代码不是填充 RecordSource,而不是 RowSource 吗? GUID 字段是否为 ReplicationID 设置了自动编号?
  • 我遇到了同样的问题。但是,当我将带有 GUID 字段的列表框设置为列,然后引用该列时,代码会返回 GUID。

标签: sql ms-access


【解决方案1】:

根据 MS 文档https://docs.microsoft.com/en-us/office/vba/api/Access.Application.StringFromGUID

Microsoft Access 数据库引擎将 GUID 存储为字节类型的数组。但是,Access 不能从窗体或报表上的控件返回字节数据。要从控件返回 GUID 的值,您必须将其转换为字符串。要将 GUID 转换为字符串,请使用 StringFromGUID 函数。要将字符串转换回 GUID,请使用 GUIDFromString 函数。

StringFromGUID(Me.txtSecID.Value)

但是,这会导致如下输出: {guid {2786C27B-CB7C-4DEA-8340-1338532742DE}}

这应该仍然可以用作过滤条件,但可以进行进一步处理以从该字符串中提取 GUID。使用字符串操作函数删除 {guid 标头和尾随 }。点评Access - GUID value stored in textbox, can't be used in SELECT statements

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2011-05-08
    相关资源
    最近更新 更多