【问题标题】:Adding records to fields which get data from another table将记录添加到从另一个表中获取数据的字段
【发布时间】:2014-01-15 22:22:18
【问题描述】:

我目前正在尝试向表中添加新记录,我们将其命名为 'tbl1'。这包含字段

ID | SID | Payment | PaymentDate | TID 

SID 字段当前从另一个表中获取其值,我们称之为 'tbl2' 这包含字段

SID | Forename | Surname | Location

我有一个向 tbl1 添加付款记录的表单,它成功添加了 IDPaymentPaymentDate 字段。这一切都很好,但是表单不包含 SID 的提交框,这是因为用户很难记住 SID。 因此,他们在表单中输入了名字和用户名。

我将如何从 tbl2 中检索 SID 给定表单中的名字和姓氏,然后将 SID 应用到 tbl1

我尝试过双 SQL 语句,例如:

SELECT tbl2.Forename, tbl2.Surname FROM tbl2 WHERE tbl2.Forename = (FromInputForename) , tbl2.surname = (FOrmInputSurname)

据我了解,这应该会得到与之关联的记录,然后我应该能够从中检索 SID

但这并没有奏效,如果你明白我来自哪里,你能帮帮我吗?

我试过了:

'Declaring the connection route
Public connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data TestDB.accdb"
'The cursor
Public conn As New OleDbConnection(connstring)

Private Sub Addrecordbtn_Click(sender As Object, e As EventArgs) Handles Addrecordbtn.Click
    SPaid = Paidtxt.Text
    'Checking if connection is open.
    If conn.State = ConnectionState.Closed Then
        conn.Open()
    End If
    'SQL Query command for ADDING
    Dim sqlquery1 As String = "INSERT INTO tbl1 (Payment,PaymentDate) VALUES (@SPaid,@todaysdate)"
    'Creating the command itself.
    Dim sqlcommand As New OleDbCommand
    With sqlcommand
        'Telling what query
        .CommandText = sqlquery
        '  Paramaters to add with values.
        .Parameters.AddWithValue("@SPaid", SPaid)
        .Parameters.AddWithValue("@todaysdate", Today.Date)
        '   Selecting the connection
        .Connection = conn
        '  Executing the non query
        .ExecuteNonQuery()
    End With
    Dim sqlquery2 As String = "SELECT tbl2.Forename, tbl2.Surname FROM tbl2 WHERE tbl2.Forename = Forenametxt.text , tbl2.surname = Surnametxt.text"
    Dim da As OleDbDataAdapter = New OleDbDataAdapter(sqlquery2, conn)
    Dim ds As DataSet = New DataSet
    da.Fill(ds, "Payments")
    Dim dt As DataTable = ds.Tables("Payments")
    'Will then go on to display data.
    conn.Close()
End Sub

【问题讨论】:

  • 好吧,首先您的查询没有选择 SID,它选择了 ForenameSurname。该查询不会返回您没有告诉它返回的任何数据。除此之外,您如何查询数据库?你能告诉我们你用来构建和执行这个查询的代码吗?
  • 已更新问题答案。
  • 正如我之前提到的,您的第二个 SQL 语句不会从 tbl2 检索 SID。您需要将该列添加到您的SELECT,然后才能使用它。如果您想将 SID INSERT 转换为 tbl1,我还建议您交换语句的位置

标签: vb.net ms-access


【解决方案1】:

INSERT INTOSELECT 语句一起使用

INSERT INTO tbl1 (SID,Payment,PaymentDate) 
(SELECT SID, @SPaid, @todaysdate 
FROM tbl2
WHERE Forename = @Forename AND Surname = @Surname)

然后将名字和姓氏参数添加到您的命令中

.Parameters.AddWithValue("@SPaid", SPaid)
.Parameters.AddWithValue("@todaysdate", Today.Date)
.Parameters.AddWithValue("@Forename ", Forenametxt.text)
.Parameters.AddWithValue("@Surname", Surnametxt.text)

请注意,如果在tbl2 中找不到ForenameSurename,则不会将新行添加到tbl1 另一方面,正如 @Adrian 在 cmets 中提到的那样 - 如果在 tbl2 中超过一个同名用户,则将创建多行。

【讨论】:

  • 如果有多个人同时使用ForenameSurname,您将获得多行。
  • @Adrian 是的,你是对的,但是如果他通过 ForenameSurbname 搜索 SID,那么我假设在他的应用程序中,创建新用户的逻辑必须阻止创建用户具有相同的SurnameForename(可能在tbl2 ForenameSurname 是主键)。如果不是,那么他永远不会知道必须使用哪个SID 进行支付,如果tbl2 中有两个或三个同名用户...
  • 这通常是一个安全的假设,我同意。稍有不同,通过在插入语句之外选择 SID,您可以进行验证,以确保您只插入任何内容、一行或由于重复数据而可能引发错误。由于这似乎是一个处理金融交易数据的系统,所以安全总比后悔好
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多