SQL使用VB.NET一次将数据添加到两个表中

时间:2018-01-29 13:43:23

标签: sql-server vb.net

我想将数据插入两个表中,第二个表是使用VB的外键(自动递增)。

到目前为止,这是我的代码......

cmd.CommandText = "INSERT INTO Customer (CustomerUsername, CustomerAge, CustomerPassword)  " +
                   "VALUES (' " & txtusername.Text & " ' ,'" & txtage.Text & " ', '" & txtpassword.Text & " ')";
cmd.CommandText = "INSERT INTO Premier (CustomerID) FROM Customer.CustomerID";
cmd.ExecuteNonQuery();

我的第一个INSERT工作正常。只是不确定如何INSERT到第二个表(因为它是自动递增),我没有使用文本框输入。

提前致谢!

1 个答案:

答案 0 :(得分:3)

您可以使用此查询接收插入第一个表格中的自动增量值(A.K.A. IDENTITY)

cmd.CommandText = "INSERT INTO Customer (CustomerUsername, CustomerAge, CustomerPassword) 
                  VALUES(@user, @age, @pass); SELECT SCOPE_IDENTITY()"

cmd.Parameters.Add("@user", SqlDbType.NVarChar).Value =  txtusername.Text
cmd.Parameters.Add("@age", SqlDbType.Int).Value = Convert.ToInt32(txtage.Text)
cmd.Parameters.Add("@pass", SqlDbType.NVarChar).Value = txtPassword.Text
Dim idCustomer = Convert.ToInt32(cmd.ExecuteScalar())

此时很容易添加到其他表

cmd.CommandText = "INSERT INTO Premier (CustomerID) VALUES (@id)"
cmd.Parameters.Add("@id", SqlDbType.Int).Value = idCustomer
cmd.ExecuteNonQuery()

注意如何使用相同的调用执行两个命令,只需用分号分隔它们。现在,SCOPE_IDENTITY

  

返回插入标识列的最后一个标识值   相同的范围

另外,您可以使用OUTPUT clause语法

cmd.CommandText = "INSERT INTO Customer (CustomerUsername, CustomerAge, CustomerPassword) 
                  OUTPUT INSERTED.ID
                  VALUES(@user, @age, @pass)"

其中ID是Customer表中由关键字INSERTED

表示的自动增量列的名称

但是,您应该关注的最重要的事情是我如何更改您的查询以使用参数化方法。这样做的原因有很多,你可以找到最重要的SQL Injection。其他原因是解析问题(如果您的用户名包含单引号怎么办?)或者一些简单的错误,例如插入客户名称时的错误。您是否注意到在客户名称之前和之后添加了虚假空间?

最后,有点超出范围,但您还应该考虑在数据库中以明文形式存储密码是一个很大的安全风险。

请参阅Best way to store passwords in database