8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

MS-Access 2016 查询字符串条件不匹配

Gleb Kiva 3月前

108 0

我已经使用 VB、VBA 和 Access 编程多年,但这对我来说还是个新手...我有两个表,它们的字段名称相同,属于短文本数据类型 (255)。所有其他属性...

我已经使用 VB、VBA 和 Access 编程多年,但这对我来说还是新鲜事……

我有两个表,它们的字段名称相同,都是短文本数据类型 (255)。所有其他属性都相同。一个表在此字段中具有不同的值,另一个表具有许多相同的值。当我使用此字段在查询中连接这两个表时,它不会返回所有匹配的行。例如:

SELECT tProjects.[Original Project]
   , tActivity.[Original Project]
FROM tProjects 
INNER JOIN tActivity ON tProjects.ID = tActivity.ProjectID
WHERE (((tProjects.[Original Project])="Mike Simpson:1967 Alfa Romeo Duetto Spider"));

我可以打开每个表并复制/粘贴上述条件中使用的字符串。两个表在 [Original Project] 字段中都有相同的字符串... \'Mike Simpson:1967 Alfa Romeo Duetto Spider\'。如果我从一个表复制并粘贴并仅在该表上使用此条件,它会返回值。但是,我在具有完全相同文本、文本长度和字段属性的另一个表上使用复制的值,它不会返回值。如果我打开第二个表并复制文本并将其用作针对第二个表的选择查询中的字符串条件,它会返回记录。

我还注意到一个奇怪的行为,即只有当字符串少于 23 个字符时,在字符串末尾使用 \'Like\' 和通配符才有效。

由于我正在导入文本文档并循环查找新项目,即 - 与现有项目不匹配,因此这突然弄乱了我的数据库。因此,我突然得到了重复的项目。

我尝试了前端和后端数据库的 R&C,甚至将表本地化。

任何帮助,将不胜感激。

谢谢。

我尝试了所有能想到的方法。

帖子版权声明 1、本帖标题:MS-Access 2016 查询字符串条件不匹配
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Gleb Kiva在本站《ms-access》版块原创发布, 转载请注明出处!
最新回复 (0)
  • void 3月前 0 只看Ta
    引用 1

    MS Access 正在将 SQL Server 日期格式 \'2023-01-01\' 转换为 01.01.20231,或将 \'2023-02-28\' 转换为 28.02.202359。附加的数字是一年中的日期。有人知道该怎么做吗?

    MS Access 正在将 SQL Server 日期格式 \'2023-01-01\' 转换为 01.01.20231,或将 \'2023-02-28\' 转换为 28.02.202359。附加的数字是一年中的日期。有人知道为什么吗?

    这与链接表无关,我只是用 Access 表测试了一下,得到了相同的结果。

  • Shad 3月前 0 只看Ta
    引用 2

    有一个包含 100 个表的 .accdb(Microsoft Office Access)文件,我创建了一个从 Ajax 请求上传的文件中读取一个表的函数。它运行良好,我想更新它以读取所有

    有一个包含 100 个表的 .accdb(Microsoft Office Access)文件,我创建了一个从 Ajax Request 上传的文件中读取一个表的函数。它运行良好,我想更新它以读取所有表而不指定表名(如模块)。我三周前才开始学习 Java 编程,但找不到正确的解决方案。你能帮帮我吗?

    后端

        @PostMapping("/upload")
        @ResponseBody
        public String upload(@RequestParam("file") MultipartFile file) {
        {
            try {
                String url = "jdbc:ucanaccess://" + tempFile.getAbsolutePath();
                Connection conn = DriverManager.getConnection(url);
    
                // Example: Querying data from a table
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT * FROM Car_Model_List");
                ResultSetMetaData rsmd = rs.getMetaData();
                int columnsNumber = rsmd.getColumnCount();
                DatabaseMetaData metaData = conn.getMetaData();
                ResultSet tables = metaData.getTables(null, null, null, new String[]{"TABLE"});
    
                // Get data rows
                while (rs.next()) {
                    Map<String, Object> row = new HashMap<>();
                    for (int i = 1; i <= columnsNumber; i++) {
                        String columnName = rsmd.getColumnName(i);
                        Object value = rs.getObject(i);
                        row.put(columnName, value);
     
                    }
                    resultList.add(row);
                }
    
                conn.close();
            } catch (IOException | SQLException e) {
                e.printStackTrace();
                // You may want to handle the exception more gracefully here
            }
            result.put("content", resultList);
    
            return result;
        }
    

    Ajax 请求

                        $.ajax({
                            url: '/data_visualization/upload',
                            type: 'POST',
                            processData: false,
                            contentType: false,
                            data: formData,
                            success: function (res) {
                                console.log(res, typeof res)
                                if (typeof res === "object") {
                                    toastr.success("All data has been fetched successfully!", "Success")
                                    let dataArr = res["content"];
                                    let table = $('#kt_table').DataTable({ data: dataArr, ... });
                                }
                                else toastr.error("Something went wrong!");
                            },
                            error: function (err) {
                                console.log(err);
                                toastr.error("Failed!");
                            }
                        })
    
  • 我正在设计一个篮球赛季统计数据库作为我的数据库管理课程的最终项目,并且在创建自定义关系时遇到了麻烦。更具体地说,我...

    我正在设计一个篮球赛季统计数据库作为数据库管理课程的期末项目,但在创建自定义关系时遇到了麻烦。更具体地说,我想编辑从 1 到客户编号的关系中的最小基数。

    例如,我的 PLAYER 和 TEAM 表之间的概念关系是多对一,但实际上,TEAM 至少要有 14 名球员才能被视为一支球队。因此,关系实际上是多(至少 14 名):一。

    另一个例子是我的 GAME 与 TEAM 关系:从概念上讲,它是多:多关系,但实际上它是多:最小(2)最大(2)关系(因为一场比赛至少有两支球队,最多有两支球队)。

    有没有办法在 Access 中编程这些最小值/最大值?任何帮助都非常感谢

    目前,我只有一个交集表来处理这些关系,但它们并没有强制执行我需要的最低要求。我没有尝试太多,因为坦率地说,我不知道该去哪里找。

  • 我使用 DoCmd.TransferText acImportFixed 成功将文本从 iPad 通过 iCloud Drive 导入 Windows。单引号和双引号无法正确转换。例如:让我们尝试一个 \'typica...

    我成功使用 DoCmd.TransferText acImportFixed 通过 iCloud Drive 将文本从 iPad 导入 Windows。单引号和双引号无法正确转换。

    例子:

    让我们尝试一下 ' 和 \' 字符的 \'典型\' 用法

    转换为

    让我们尝试一下“典型”的“和”字符用法

    请注意,前导双引号和尾随双引号之间的转换是不同的,这导致导入后更正变得困难。

    我尝试过各种代码页 ID,但都没有成功。例如

    DoCmd.TransferText acImportFixed, "TestSpec", Txt_tableName, "C:\Users\josmi\iCloudDrive\Events\" & txt_fileName, 0, , 65001 
    

    即 utf_8。我尝试了无代码页和其他许多方法,但都没有成功。

  • 我们的 Intranet(Windows Server 2019/IIS 10)正在使用一个简单的访问数据库。在 global.asa 中,我们连接到此数据库,因为它:\'strconn = \'DRIVER={Microsoft Access Driver (*.mdb, *.accd...

    我们的 Intranet(Windows Server 2019 / IIS 10)正在使用一个简单的访问数据库。在 global.asa 中,我们连接到此数据库,如下所示:

    \'strconn = \'DRIVER={Microsoft Access 驱动程序 (*.mdb, *.accdb)};DBQ=C:\inetpub\intranet\data.mdb\'set conn = Server.CreateObject(\'ADODB.Connection\')conn.open strconn\'

    Windows 身份验证已启用

    当我使用管理员帐户连接到内联网时,它运行正常,当我使用用户帐户连接到内联网时,身份验证窗口打开;它失败,直到我使用管理员帐户登录

    奇怪的行为:如果我使用管理员帐户在 Intranet 上导航一次,则所有其他用户都可以在 Intranet 上导航(无论使用哪台计算机)!!!!

    导致此问题的行是 \'conn.open strconn\'

    我检查了数据库文件权限、ACEODBC.DLL 权限,尝试使用 ODBC 系统数据源,使用 processmonitor 检查是否可以看到 ACCESS DENIED,然后卸载/安装访问数据库引擎...

    想法:看起来管理员创建了一个文件,用户可以修改这个文件,这可以解释这种情况;因此,我检查了 c:\temp 、 c:\windows\temp 上的用户权限,因为 JETxxx.tmp 文件只创建了一次,并一直保留到空闲超时发生,这看起来像是我的问题。

    我的解决方法是将 IDLE 超时设置为零,然后使用管理员帐户打开一次 Intranet......这只有在我们不重新启动服务器或 IIS 时才有效,我们必须解决这个问题。

    我不知道如何检查哪一层失败了?

    我现在很绝望......它应该很简单......

    谢谢

  • 使用 MS Access 2019 部署我开发的 .accde 表单。它从托管在共享文件夹中并作为链接表导入的 .tab 文本文件中检查当前表单版本的值...

    使用 MS Access 2019 部署 我开发的 .accde

    托管在共享文件夹中并作为链接表导入数据库的 .tab 中检查当前表单版本的值

    中有效 .accdb ,但在 .accde 版本中会引发错误 3625:

    文本文件规范‘X’不存在...

    从文件读取数据的代码(位于模块内部):

    Public Function checkVer()
        Dim ind As Boolean
        ind = DLookup("[ACTIVE]", "Ver", "Ver = '9'")
        If Not ind Then
            MsgBox "This version is obsolete. You may get the latest version from the shared folder."
            Application.Quit acSaveNo
        End If
    End Function
    

    该函数的调用方式:

    Private Sub Form_Load()
        checkVer
    End Sub
    

    任何帮助都将不胜感激...

    我尝试从 MSYSImexSpecs 表中删除文件规范记录,删除链接表并再次将文件重新导入为链接表,压缩和修复,进行完整反编译并成功测试了表单的 .accdb 版本中的功能。

  • 请注意,If condition Then b = True Else b = False End If 与 b = 条件相同。

  • 我通过将 Windows 设置中的日期格式手动更改为美国格式,然后改回德国格式,解决了这个问题。这之前我仔细检查了注册表,卸载了 Office,重新安装了法语版 Office(没用),卸载了 Office,重新安装了英语版 Office,费尽心思(没花多长时间,头发所剩无几了)

  • 按照 Ken White 的评论,每场比赛有两支球队,这是有组织的,而且即使在高中,球员也会更换球队:

    enter image description here

    请参阅此处: https://answers.microsoft.com/en-us/msoffice/forum/all/multiple-foreign-keys-in-table-linked-to-same/b0ecce86-699e-4e43-956e-8306385d0dd9 如果主键的表有别名,关系工具将接受来自同一主键的两个外键。在这种情况下,只需将团队表拖到关系表面上两次即可。

    根据 June7 的评论,团队约束的 14 名成员(在我的示例中为 2 名)属于数据验证。我通常也在数据输入期间处理数据验证。在这种情况下,我想说无论如何在表级别处理我所谓的多级约束是不可能的。例如,为了清楚起见,我将约束抽象为一个函数。该函数是公共的,位于代码模块中,因此我可以在数据库中的任何地方重复使用它。

    Public Function isValidTeam(TeamID As Long, day As Date) As Boolean
        Dim minimum As Integer
        minimum = 2 '2 players to a team
        Dim teammembercount As Integer
        Dim rs As Recordset
        Set rs = CurrentDb.OpenRecordset("Select * FROM PlayersTeams Where TeamID = " & TeamID)
        If rs.RecordCount > 0 Then
            rs.MoveFirst
            Do Until rs.EOF
                If isValidPlayer(rs!PlayerID, TeamID, day) Then
                    teammembercount = teammembercount + 1
                End If
                rs.MoveNext
            Loop
        End If
        If teammembercount >= minimum Then
            isValidTeam = True
        Else
            isValidTeam = False
        End If
    End Function
    
    Public Function isValidPlayer(PlayerID As Long, TeamID As Long, day As Date) As Boolean
        'debug.print isValidPlayer(1, 1, cdate("4/2/24"))
        Dim returnvalue As Boolean
        returnvalue = Nz(DLookup("PlayerTeamID", "PlayersTeamsStartDateDescending", "PlayerID = " & PlayerID & " AND TeamID = " & TeamID & " AND #" & day & "# >= StartDate AND isnull(EndDate)"), False)
        If returnvalue = False Then
            returnvalue = Nz(DLookup("PlayerTeamID", "PlayersTeamsStartDateDescending", "PlayerID = " & PlayerID & " AND TeamID = " & TeamID & " AND #" & day & "# >= StartDate AND #" & day & "#"), False)
        End If
        isValidPlayer = returnvalue
    End Function
    

    以下是带有一些级联列表框的表单示例。如果团队有足够的成员,则它是有效的。

    enter image description here

    enter image description here

    enter image description here

    当选择一个团队时,将调用 isValidTeam 并显示结果。

    Private selectedteam As Long
    Public validselectedteam As Boolean
    Public selectedday As Date
    Public lblText As String
    
    Public Function GetSelectedTeam() As Long
        GetSelectedTeam = selectedteam
    End Function
    
    Public Function SetSelectedTeam(value As Long)
        selectedteam = value
    End Function
    
    Private Sub lstTeams_AfterUpdate()
        SetSelectedTeam (Me.lstTeams)
        selectedday = Me.txtDate
        validselectedteam = isValidTeam(selectedteam, selectedday)
        If validselectedteam Then
            Me.txtValid.ForeColor = RGB(0, 0, 255)
            Me.txtValid = "valid"
        Else
            lblText = "invalid"
            Me.txtValid.ForeColor = RGB(255, 0, 0)
            Me.txtValid = "invalid"
        End If
        Me.chkValid = validselectedteam
        Dim sql As String
        sql = "SELECT Players.PlayerID, Players.PlayerNickName "
        sql = sql & "FROM Players INNER JOIN PlayersTeams ON Players.PlayerID = PlayersTeams.PlayerID "
        sql = sql & "WHERE (((PlayersTeams.TeamID)=[qryteamid]) AND ((PlayersTeams.StartDate)<[day]))"
        sql = Replace(Replace(sql, "[day]", "#" & Me.txtDate & "#"), "[qryteamid]", Me.lstTeams)
        Me.lstTeamPlayers.RowSource = sql
        Me.lstTeamPlayers.Visible = True
        Me.lblTeamPlayers.Visible = True
        Me.lstAvailablePlayers.Visible = True
        Me.lblAvailablePlayers.Visible = True
        Me.Refresh
    End Sub
    
  • XDR 3月前 0 只看Ta
    引用 11

    我的日期/时间格式是 dd.MM.yyyy,Excel 可以正常工作。Access 中的某个地方显然(既然您指出了这一点)有些地方变形了。对我来说,解决方法是使用基于表格的视图,并手动格式化日期。我会在注册表中四处查看,看看会出现什么结果

  • 日期值没有格式,因此您的本地日期/时间格式不知何故被设置为类似 dd.mm.yyyyn .

    在 Access 中,在 Immidiate 窗口中尝试:

    ? Format(Now, "dd/mm/yyyy")
    

    它应该返回,因为您的日期分隔符似乎是一个点:

    02.03.2024
    
  • xav 3月前 0 只看Ta
    引用 13

    这对你有用,希望你喜欢

    public String upload(@RequestParam("file") MultipartFile file) {
    {
        try {
            String url = "jdbc:ucanaccess://" + tempFile.getAbsolutePath();
            Connection conn = DriverManager.getConnection(url);
    
            DatabaseMetaData metaData = conn.getMetaData();
            ResultSet tables = metaData.getTables(null, null, null, new String[]{"TABLE"});
    
            while (tables.next()) {
                String tableName = tables.getString("TABLE_NAME");
    
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
    
                List<Map<String, Object>> tableContent = new ArrayList<>();
                ResultSetMetaData rsmd = rs.getMetaData();
                int columnsNumber = rsmd.getColumnCount();
    
                while (rs.next()) {
                    Map<String, Object> row = new HashMap<>();
                    for (int i = 1; i <= columnsNumber; i++) {
                        String columnName = rsmd.getColumnName(i);
                        Object value = rs.getObject(i);
                        row.put(columnName, value);
                    }
                    tableContent.add(row);
                }
    
                result.put(tableName, tableContent);
            }
    
            conn.close();
        } catch (IOException | SQLException e) {
            e.printStackTrace();
            // You may want to handle the exception more gracefully here
        }
    
        return result;
    }
    
  • 引用 14

    您可以在数据输入期间使用代码强制执行这些限制。这称为“数据验证”。这需要为用户界面构建表单。您在第二句中指的是“自定义数字”吗?

  • 引用 15

    感谢您的提问。我想为所有表格创建该函数,这样我就可以像读取 .accdb 并返回解析后的表格的模块一样使用它。这样我就可以在 jquery 中使用返回的数据进行管理。

  • - 是的,但仍然是两支球队同时打一场比赛。将一支球队的球员人数限制在一定数量与一对多或多对多无关,而且这不是您可以轻松地在数据库级别执行的操作 - 它应该在应用程序级别完成。您可能能够在存储过程中执行此操作,但必须有某种程序导致该过程被执行,而 Access 无论如何都不支持存储过程。并且很容易在 TEAM 记录中添加一个标志,指示他们是否符合资格(有 14 名球员)。

  • @ErikA — \'对 UTF-8 的支持很差\' — 我同意,但如果导入规范配置错误(我怀疑如此),将文件转换为 UTF-16 也无济于事。我已经验证了

  • 引用 18

    我很感谢你的评论,但我并不认为我感到困惑。我确实有一支球队的多名球员,但你只谈论一个球队实例。会有很多球队实例,因为一个赛季中有很多球队比赛,而每个球队实例中都会有很多球员。但无论如何,这个问题是在问如何在 Microsoft Access 中强制执行最低限制,以便“球队”在没有至少 14 名球员的情况下不能存在。如果你能提供帮助,我将不胜感激。

  • Snak 3月前 0 只看Ta
    引用 19

    Access 对 UTF-8 的支持一直不太好,至少上次我尝试使用时是这样。我会先转换为 UTF-16,然后再导入。

  • 您似乎搞混了。您有一支球队,有多名球员(一对多),而您有一场比赛,有两支球队(一对多)。您试图反向查看这些关系。

返回
作者最近主题: