Vb.net 向从另一个表获取数据的字段添加记录

Vb.net 向从另一个表获取数据的字段添加记录,vb.net,ms-access,Vb.net,Ms Access,我目前正在尝试向表中添加一条新记录,我们将其称为“tbl1”。这包含字段 ID | SID | Payment | PaymentDate | TID SID | Forename | Surname | Location SID字段当前从另一个表中获取其值,我们将其称为“tbl2”,其中包含字段 ID | SID | Payment | PaymentDate | TID SID | Forename | Surname | Location 我有一个表单,它将付款记录添加到tbl

我目前正在尝试向表中添加一条新记录,我们将其称为“tbl1”。这包含字段

ID | SID | Payment | PaymentDate | TID 
SID | Forename | Surname | Location
SID字段当前从另一个表中获取其值,我们将其称为“tbl2”,其中包含字段

ID | SID | Payment | PaymentDate | TID 
SID | Forename | Surname | Location
我有一个表单,它将付款记录添加到tbl1,它成功地添加了ID付款付款日期字段。这一切都很好,但是表单没有包含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

使用
INSERT-INTO
SELECT
语句

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
中未找到
Forename
Surename
,则不会将新行添加到
tbl1

另一方面,正如@Adrian在评论中提到的那样,如果在
tbl2
中有多个同名用户,则会创建多行。

好吧,从您的查询开始,没有选择SID,而是选择
Forename
姓氏
。查询不会返回任何您没有告诉它返回的数据。除此之外,您如何查询数据库?您可以向我们展示用于生成和执行此查询的代码吗?已用问题答案更新。正如我前面所述,您的第二条SQL语句对从
tbl2
检索SID没有任何作用。您需要将该列添加到
选择中,然后才能使用它。如果要将SID插入
tbl1
,并且如果有多个人同时拥有
Forename
姓氏,我还建议您交换语句的位置。@Adrian是的,您是对的,但是如果他通过
Forename
Surbname
搜索
SID
,那么在他的应用程序中,我假设,创建新用户的逻辑必须防止创建具有相同
姓氏和
Forename
的用户(可能位于
tbl2
Forename
姓氏
是主键)。如果没有,那么他就永远不会知道在
tbl2
中,如果有两个或三个同名的用户,在支付中必须使用哪个
SID
,这通常是一个安全的假设,我同意。通过在inserting语句之外选择SID来执行稍微不同的操作,将允许您进行验证,以确保您只插入了一行,或者由于重复数据而可能引发错误。因为这似乎是一个处理金融交易数据的系统,所以最好是安全的