【问题标题】:DUAL alternative in ms access databasems access 数据库中的 DUAL 替代方案
【发布时间】:2019-10-24 00:26:17
【问题描述】:

我正在使用 VB.NET 和 MS Access 数据库中的 Windows 窗体。我需要检查用户是否已存在于我的数据库中,并相应地采取进一步措施。搜索了一段时间后,我遇到了这个解决方案。

INSERT INTO usertabble (user_name , pass_word) 
SELECT 'username', 'password' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM usertable
WHERE user_name='username' AND pass_word='password' LIMIT 1)

但问题是 DUAL 关键字。在该关键字之后查询显示语法错误。我了解到 DUAL 是 oracle 数据库独有的。 所以我找到了一个 MS Access 的解决方法,它在同一个数据库中创建名为 DUAL 的表。但这也行不通。

我的方法有什么问题吗?还是根本不可行?还有其他选择吗?

【问题讨论】:

  • 为什么要pass_word='username'?如果在 Access 表中将 user_name 和 pass_word 定义为复合唯一索引,则使用INSERT INTO usertabble(user_name, pass_word) VALUES('username', 'password') 语法将不会插入重复记录。
  • 我的错。现已编辑。
  • stackoverflow.com/questions/28282127/… 在从另一个表中提取值但无法使用参数时有效。
  • LIMIT 在 Access SQL 中不受支持。
  • @June7 我从您提供的链接中阅读了该答案。但那里有可用的桌子,但这里没有。 DUAL 字面上是用于访问 sql 的假想表。我确实尝试过制作名为 DUAL 的表,其中只有 1 行。但这也行不通。

标签: sql vb.net ms-access


【解决方案1】:

您只需使用select value1, value2 wihtout from 子句 (from DUAL) 即可获得相同的结果。

【讨论】:

    【解决方案2】:

    嗯,不清楚为什么不简单地检查用户,然后根据此检查采取行动?

    您没有提及替代操作是什么,但检查给定用户的存在似乎是一件简单的事情,然后采取您想要的任何操作。

    所以,你可以像这样检查是否存在:

        Dim lngID  as integer
        lngID = CheckForUser("Albert", "Password")
        if lngID = 0 Then
            MsgBox("password not found")
        Else
            MsgBox("password found, PK ID = " & lngID.ToString)
            ' code to use PK "id" of user found goes here
        End If
    

    当然还有一个方便的函数说:

    Public Function CheckForUser(strUser As String, strPass As String) As Integer
    
        Dim MySQL As String = "SELECT ID, user_name, pass_word from usertable " &
                              "WHERE user_name = ? AND pass_word = ?"
        Dim lngID As Integer = 0
    
        Using MyCon As New OleDbConnection(My.Settings.test443)
            MyCon.Open()
            Dim sqlCmd As New OleDbCommand(MySQL, MyCon)
            sqlCmd.Parameters.Add("?", OleDbType.VarWChar).Value = strUser
            sqlCmd.Parameters.Add("?", OleDbType.VarWChar).Value = strPass
            lngID = sqlCmd.ExecuteScalar
        End Using
        Return lngID
    
    End Function
    

    我不太确定为什么 DUAL 的问题在这里如此重要?

    现在,如果您的问题是我是否检查名称,如果没有,我想添加,以及如何对两个操作使用一个查询,那么我们这里有一个不同的问题。

    不清楚目标和使用 DUAL(我们无权访问)而不是检查表中是否存在名称/记录。

    【讨论】:

    • 感谢您的详细解释,并确保我仍然可以达到相同的结果。
    【解决方案3】:

    这个查询:

    INSERT INTO usertabble (user_name , pass_word)
        SELECT 'username', 'password'
        FROM DUAL
        WHERE NOT EXISTS (SELECT *
                          FROM usertable
                          WHERE user_name = 'username' AND pass_word = 'password'
                          LIMIT 1
                         );
    

    在 MS Access 中没有意义。

    基本上,您可以使用唯一索引或唯一约束来保持唯一性。大概,您只是希望 user_name 是唯一的:

    create unique index unq_usertable_username on usertable(user_name);
    

    如果需要,您可以包含更多列。

    这将防止数据库插入具有相同值的多行。

    【讨论】:

    • 是的,同意。我应该将用户名定义为主键或唯一索引。但是让我们说,如果我不想那样做,那该怎么办?真正的问题是关于 DUAL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多