我有一个vbscript块,它接受一个变量,用它构建一个sql字符串,执行sql字符串,然后将sql查询的结果与原始变量一起传递到另一个子。它几乎一直在工作,除了一个实例。以下是代码(我添加了行号以供参考…此外,我知道record_source没有使用,我在几个月前为向后兼容性进行更改时留下了它):
1224 Sub UpdateContact1 (record_source, user_id)
1225 Response.Write("UpdateContact1 - user_id: " & user_id & "<br />")
1226 strSQL = "EXEC usp_GM_GetInfoForContact1 " & user_id
1227 Set rs = con.Execute(strSQL)
1228 Response.Write("UpdateContact1 after sql - user_id: " & user_id & "<br />")
1229 If Not rs.EOF Then
1230 Response.Write("UpdateContact1 inside of If<br />")
1231 Response.Write("user_id: " & user_id & "<br />")
1232 InsertFullContact1 user_id, rs("GoldMineAccountNumber"), rs("BusinessName"), rs("FullName"), rs("LastName"), rs("Salutation"), rs("Title"), rs("WorkPhone"), rs("CellPhone"), rs("HomePhone"), rs("PrimaryFax"), rs("WorkExt"), rs("Address1"), rs("Address2"), rs("City"), rs("State"), rs("PostalCode"), rs("Country"), rs("FirstName"), rs("ReferralName"), rs("PrivateTitle"), rs("Specialty"), "", rs("GLA"), rs("GroupsDesc"), rs("RolesDesc")
1233 End If
1234 End Sub
下面是代码的结果:
UpdateContact1 - user_id: 34838
error '80020009'
/includes/gm_functions.asp, line 1228
最初的研究表明错误80020009可能表明变量为空。我检查使用IsNull:
1224 Sub UpdateContact1 (record_source, user_id)
1225 Response.Write("UpdateContact1 - user_id: " & user_id & "<br />")
1226 strSQL = "EXEC usp_GM_GetInfoForContact1 " & user_id
1227 Set rs = con.Execute(strSQL)
1228 If IsNull(user_id) Then
1229 Response.Write("user_id is null")
1230 Else
1231 Response.Write("user_id is not null<br />")
1232 Response.Write("Length: " & Len(user_id) & "<br />")
1233 End If
1234 If Not rs.EOF Then
1235 Response.Write("UpdateContact1 inside of If<br />")
1236 Response.Write("user_id: " & user_id & "<br />")
1237 InsertFullContact1 user_id, rs("GoldMineAccountNumber"), rs("BusinessName"), rs("FullName"), rs("LastName"), rs("Salutation"), rs("Title"), rs("WorkPhone"), rs("CellPhone"), rs("HomePhone"), rs("PrimaryFax"), rs("WorkExt"), rs("Address1"), rs("Address2"), rs("City"), rs("State"), rs("PostalCode"), rs("Country"), rs("FirstName"), rs("ReferralName"), rs("PrivateTitle"), rs("Specialty"), "", rs("GLA"), rs("GroupsDesc"), rs("RolesDesc")
1238 End If
1239 End Sub
输出:
UpdateContact1 - user_id: 34838
user_id is not null
error '80020009'
/includes/gm_functions.asp, line 1232
使用相同的user_id在SSMS中手动执行存储过程可以正常工作。我甚至无法理解变量发生了什么,更不用说修复它了。我很感激你的帮助。
谢谢…
我很确定你的问题与定义变量有关。让我解释一下我为什么这么认为。我创建了一个测试页面(test.asp)
<!--#include virtual="/includes/gm_functions.asp"-->
<%
UpdateContact1 "who cares", 34838
'UpdateContact1DefineNewVar "who cares", 34838
response.write("Finished")
%>
这里是我的UpdateContact1和UpdateContact1DefineNewVar函数
Sub UpdateContact1 (record_source, user_id)
Response.Write("UpdateContact1 - user_id: " & user_id & "<br />")
strSQL = "EXEC usp_GM_GetInfoForContact1 " & user_id
Response.Write("Hey I created a SQL query <br />")
Set rs = con.Execute(strSQL)
Response.Write("Hey I got some data<br/>")
If Not rs.EOF Then
Dim some ''code
End If
End Sub
Sub UpdateContact1DefineNewVar (record_source, user_id)
Dim strSQL
Dim rs
Response.Write("UpdateContact1DefineNewVar - user_id: " & user_id & "<br />")
strSQL = "EXEC usp_GM_GetInfoForContact1 " & user_id
Response.Write("Hey I created a SQL query <br />")
Set rs = con.Execute(strSQL)
Response.Write("Hey I got some data<br/>")
If Not rs.EOF Then
Dim some ''code
End If
End Sub
输出如下:
UpdateContact1 - user_id: 34838
Microsoft VBScript运行时错误'800a01f4'
变量未定义:'strSQL'
/includes/gm_functions.asp,第1217行
和
UpdateContact1DefineNewVar - user_id: 34838 嘿,我创建了一个SQL查询
Microsoft VBScript运行时错误'800a01a8'
对象要求:"
/includes/gm_functions.asp,第1232行
所以这个嘿,我创建了一个SQL查询让我认为你正在使用的变量没有定义(包括文件丢失?)。我不是一个专家在vbscript,但我希望它会帮助你。
更新我通过添加Response.Write(VarType(strSQL))来扩展代码
所以第一个输出是Microsoft VBScript运行时错误'800a01f4' 变量未定义:'UpdateContact1'/test.asp,第5行
第二个是
0 UpdateContact1DefineNewVar - user_id: 34838嘿,我创建了一个SQL查询Microsoft VBScript运行时错误'800a01a8'对象要求:"/includes/gm_functions.asp,第1221行
和0表示vbEmpty -表示空(未初始化)http://www.w3schools.com/vbscript/func_vartype.asp
在查看了Pavel提供的提示并对错误代码进行了更多研究之后,我能够解决这个问题。问题是,user_id被分配(在此sub被调用之前)到另一个记录集中的值,该记录集也存储在rs变量中(我在此sub中重新定义)。显然,在经典asp中,变量是通过引用而不是值赋值的…所以当我改变rs的定义时,user_id变量不再有值。我通过在子内部定义一个新变量并使用它来存储记录集而不是重新定义rs来解决这个问题。
我们需要查看存储过程来确定,但是它可能期待一个varchar字符串,而不是您传入的数字吗?
将SQL字符串装配线更改为以下内容:
strSQL = "EXEC usp_GM_GetInfoForContact1 '" & user_id & "'"
,看看能不能治好它