【问题标题】:how can i insert record in 2 tables at a time using parametrized sql query and vb script in asp classic?如何在 asp classic 中使用参数化 sql 查询和 vbscript 一次在 2 个表中插入记录?
【发布时间】:2014-08-27 07:41:58
【问题描述】:

我正在使用 ASP Classic 和 VBScript。我有 2 张桌子。第一个表包含 usernamepassword 列,第二个表包含 nameemail 列。两个表都是相关的 (table1.id = table2.Id)。

如何使用参数化 SQL 查询一次在 2 个表中插入一条记录。我的代码如下。

<%
'for table 1  
Dim objRS, objCmd, str

Set objCmd  = Server.CreateObject("ADODB.Command")
Set Objrs   = Server.CreateObject("ADODB.Recordset")

str = "insert into admin (Ausr, Apwd)values(?,?)"

With objCmd
    .ActiveConnection = MM_connDUdirectory_STRING
    .CommandText = str
    .CommandType = adCmdText

    .Parameters.Append(.CreateParameter("@sa1", adVarChar, adParamInput, len(username)))
    .Parameters.Append(.CreateParameter("@sa2", adVarChar, adParamInput, len(password)))

    .Parameters("@sa1").Value = username
    .Parameters("@sa2").Value = password
end with 
Set objRS = objCmd.Execute()

%>

对于 table2,我在从上面跟踪插入记录的 ID 时遇到了问题。在下面的代码中,我无法检索 ID:

<%
'for table 2
Dim objRS1, objCmd1, str1

Set objCmd1  = Server.CreateObject("ADODB.Command")
Set Objrs1   = Server.CreateObject("ADODB.Recordset")

str1 = "insert into detail (ID, Aname, Aemail)values(?,?,?)"

With objCmd1
    .ActiveConnection = MM_connDUdirectory_STRING
    .CommandText = str1
    .CommandType = adCmdText
    .Parameters.Append(.CreateParameter("@sa3", adInteger, adParamInput, ,ID)) 
    .Parameters.Append(.CreateParameter("@sa4", adVarChar, adParamInput, len(vname)))
    .Parameters.Append(.CreateParameter("@sa5", adVarChar, adParamInput, len(email)))

    .Parameters("@sa3").Value = ID
    .Parameters("@sa4").Value = vname
    .Parameters("@sa5").Value = email
end with 
Set objRS1 = objCmd1.Execute()

%>

请帮我解决上述问题,或者如果有任何其他方法可以使用参数化查询在 2 个表中插入记录,请告诉我。

@Tomalak 根据您的代码,我尝试使用下表来处理它

<%
Function InsertAdmin(Ausr, Apwd, Acdate, ATid, Astate, Acity, Acenterid, Aname, gender, Acontact, Aemail, ACreatedBy, suspend, allow, approve, Staff_Aid, Staff_EId, Staff_Fname, Staff_Add, Staff_Padd, Staff_Edu, Staff_doc) 

Dim objRS, objCmd, str

Set objCmd  = Server.CreateObject("ADODB.Command")
Set Objrs   = Server.CreateObject("ADODB.Recordset")

With objCmd
    .ActiveConnection = MM_connDUdirectory_STRING
    .CommandType = adCmdText
    .CommandText = Join(Array( _
        "DECLARE @id INT", _
        "insert into admin (Ausr, Apwd, Acdate, ATid, Astate, Acity, Acenterid, Aname, gender, Acontact, Aemail, ACreatedBy, suspend, allow, approve)values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", _
        "SELECT @id = SCOPE_IDENTITY()", _
        "insert into Staff_detail (Staff_Aid, Staff_EId, Staff_Fname, Staff_Add, Staff_Padd, Staff_Edu, Staff_doc)values(@id,?,?,?,?,?,?)"), vbNewLine)


.Parameters.Append(.CreateParameter("@sa1", adVarChar, adParamInput, len(StrUsr)))
.Parameters.Append(.CreateParameter("@sa2", adVarChar, adParamInput, len(md5(StrPwd))))
.Parameters.Append(.CreateParameter("@sa3", adVarChar, adParamInput, len(dt)))
.Parameters.Append(.CreateParameter("@sa4", adInteger, adParamInput, ,atypeid))
.Parameters.Append(.CreateParameter("@sa5", adInteger, adParamInput, ,StrState))
.Parameters.Append(.CreateParameter("@sa10", adInteger, adParamInput, ,StrCity))
.Parameters.Append(.CreateParameter("@sa11", adInteger, adParamInput, ,StrCenter))
.Parameters.Append(.CreateParameter("@sa118", adVarChar, adParamInput, len(stname)))
.Parameters.Append(.CreateParameter("@sa119", adVarChar, adParamInput, len(stgender)))
.Parameters.Append(.CreateParameter("@sa110", adVarChar, adParamInput, len(stcontact)))
.Parameters.Append(.CreateParameter("@sa111", adVarChar, adParamInput, len(stemail)))
.Parameters.Append(.CreateParameter("@sa6", adVarChar, adParamInput, len(Request.Cookies("Vape")("User"))))
.Parameters.Append(.CreateParameter("@sa7", adInteger, adParamInput, ,susp))
.Parameters.Append(.CreateParameter("@sa8", adInteger, adParamInput, ,allowd)) 
.Parameters.Append(.CreateParameter("@sa9", adInteger, adParamInput, ,approved)) 
'.Parameters.Append(.CreateParameter("@sa101", adInteger, adParamInput, ,@ID))
.Parameters.Append(.CreateParameter("@sa102", adVarChar, adParamInput, len(stcode)))
.Parameters.Append(.CreateParameter("@sa103", adVarChar, adParamInput, len(stfname)))
.Parameters.Append(.CreateParameter("@sa104", adVarChar, adParamInput, len(stadd)))
.Parameters.Append(.CreateParameter("@sa105", adVarChar, adParamInput, len(stpadd)))
.Parameters.Append(.CreateParameter("@sa106", adVarChar, adParamInput, len(stedu)))
.Parameters.Append(.CreateParameter("@sa107", adVarChar, adParamInput, len(stdoc)))

End With
Set objRS = objCmd.Execute() 
End Function
call InsertAdmin(StrUsr, md5(StrPwd), dt, 5, StrState, StrCity, StrCenter, stname, stgender, stcontact, stemail, a_name, 0, 1, 0, stcode, stfname, stadd, stpadd, stedu, stdoc) 
%>

但它显示一个错误说:

Microsoft VBScript 运行时 (0x800A01C2) 参数数量错误或属性分配无效:“InsertAdmin”

【问题讨论】:

  • 从不使用@@IDENTITY。这是个坏建议。使用SCOPE_IDENTITY()msdn.microsoft.com/en-us/library/ms190315.aspx
  • 我很想在存储过程中完成这一切,这样您就不必担心代码了。
  • @lok​​eshpurohit:NO 不要使用@@INDENTITY,点击我评论中的链接阅读SCOPE_IDENTITY
  • @@IDENTITY 不是范围安全的 - 如果其他人在您的查询获取身份之前运行查询,就会发生奇怪的事情。
  • 为什么你的两个表都叫“admin”?这几乎是不可能的。

标签: sql vbscript asp-classic parameter-passing


【解决方案1】:

我建议您使用一个单一的函数来一步完成插入。这个返回新插入行的ID:

Function InsertAdmin(username, password, vname, email) 
    With Server.CreateObject("ADODB.Command")
        .ActiveConnection = MM_connDUdirectory_STRING
        .CommandType = adCmdText
        .CommandText = Join(Array( _
            "DECLARE @id INT", _
            "INSERT INTO admin (Ausr, Apwd) VALUES (?, ?)", _
            "SELECT @id = SCOPE_IDENTITY()", _
            "INSERT INTO detail (ID, Aname, Aemail) VALUES (@id, ?, ?)", _
            "SELECT @id NewId" _
        ), vbNewLine)

       .Parameters.Append .CreateParameter(, adVarChar, , Len(username), username)
       .Parameters.Append .CreateParameter(, adVarChar, , Len(password), password)
       .Parameters.Append .CreateParameter(, adVarChar, , Len(vname), vname)
       .Parameters.Append .CreateParameter(, adVarChar, , Len(email), email)

       With .Execute
           InsertAdmin = .Fields("NewId").Value
       End With
   End With 
End Function 

使用BEGIN TRANSACTIONCOMMIT TRANSACTION 进行额外操作,并确保插入成功或根本不成功。

或者,您可以简单地将两个表合并为一个。对于这个用例,我认为没有充分的理由保留两个具有 1:1 关系的单独表。

【讨论】:

  • @Lankymart 你在编辑中到底做了什么改变? *困惑*
  • Syntax Highlighting - &lt;!-- language: lang-vb --&gt; See the revisions(使用降价视图)??
  • 当我查看代码并且错误的关键字被突出显示时,它让我很恼火,必须更改它。 :)
  • 您的With 语句不应该是Server.CreateObject("ADODB.Command")吗?
  • 只是一个想法,但如果它说“参数数量错误”,也许您使用的参数数量错误? ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多