Sql 如何在VBScript中将很长的整数传递给函数?
我有一个非常长的数字,需要将其用作SQL语句中要执行的参数。我试图将“testSessionID”字符串转换为double或Long,函数返回Err.description。但是当我使用testSessionID=2784863时,它工作得很好 这是我的密码:Sql 如何在VBScript中将很长的整数传递给函数?,sql,sql-server,vbscript,Sql,Sql Server,Vbscript,我有一个非常长的数字,需要将其用作SQL语句中要执行的参数。我试图将“testSessionID”字符串转换为double或Long,函数返回Err.description。但是当我使用testSessionID=2784863时,它工作得很好 这是我的密码: testSessionID = "1030000000000000005" Dim TSID TSID = CDbl (testSessionID) Dim script_testSessionStatus, testSessionSt
testSessionID = "1030000000000000005"
Dim TSID
TSID = CDbl (testSessionID)
Dim script_testSessionStatus, testSessionStatus
'Getting the TestSession Status of TestSessionID
script_testSessionStatus = ("exec GetTestSession @TestSessionID ='" & TSID & "'")
testSessionStatus = ExecuteSQLStatement_String(script_testSessionStatus, "Value")
Public Function ExecuteSQLStatement_String(Sql_Statement, colname)
Err.Clear
On Error Resume Next
objRecordSet.open Sql_Statement,objconnection,1
If Err.Number <> 0 Then
ExecuteSQLStatement_String = Err.description
objRecordSet.Close
Err.Clear
Else
ExecuteSQLStatement_String = objRecordSet.Fields(colname).Value
objRecordSet.Close
End If
On Error GoTo 0
End Function
既然你说用“你说的那句话你得到了错误的答案…”。。。示例代码的第3行: TSID=CDbl testSessionID …你不需要这一步。。。为什么?因为稍后将使用TSID变量来构建要执行的SQL字符串 exec GetTestSession@TestSessionID='&TSID&' 保留在引号里,因为这是你真正需要的。。。连接到字符串其余部分的字符串,然后作为SQL语句执行 事实上,您甚至在上面的SQL语句中将其视为字符串,因为它周围有单引号。基于此,您不需要在vbScript中将其强制转换为double或其他任何内容 如果在执行该过程时出现SQL错误,则需要告诉我们存储过程中的变量类型,以及在尝试执行时打印的确切错误消息 这是:
>> s = "1030000000000000005"
>> l = CLng(s)
>>
Error Number: 6
Error Description: Überlauf
>> d = CDbl(s)
>> WScript.Echo TypeName(d), d
>>
Double 1,03E+18
>>
应该解释错误。正如@GWR所说,不需要转换为数字数据类型,因此问题就消失了
testSessionID1由一个文本初始化,因此我们确切地知道它来自哪里。使用命令而不是字符串常量exec GetTestSession@TestSessionID='1030000000000000005'纯粹是浪费时间
更新wrt评论:
声明:
"exec GetTestSession @TestSessionID ='1030000000000000005'"
使用一串数字。所有试图通过松开或CDbl/CLng并将数字字符串化到语句中来将该字符串转换为Long或Double的尝试都是错误的,注定会失败
更新wrt其他评论:
如果但当我使用testSessionID=2784863时,它工作正常,那么转换/科学格式就是问题的原因。让它工作了。谢谢大家花时间回答这个问题 我的数据库服务器名称中有一个输入错误,这就是特定TestSessionID不在该服务器中的原因。这是复制问题。开发人员正在进行这方面的工作
再次感谢大家来看看我的问题。基本上代码是好的 错误消息是什么?可能是DB抛出错误,因为double可以处理如此长的值。BIGINT应该转换为double ok,使用CDbl。我倾向于在确定返回的内容之前不使用错误恢复,只是假设因为传递了一个更大的值,它被破坏是危险的。它可能是相关的,但不一定是假设的原因。@Lankymart-我怀疑GetTestSession过程无法处理这么大的数字。他应该检查vartype的程序参数。@PankajJaju就像我已经说过的,假设是危险的。请阅读-总结是,这不是一个理想的方式来解决志愿者,可能会适得其反获得答案。请不要将此添加到您的问题中。我不会鼓励这种方法,因为它对SQL注入是开放的,我们不知道testSessionID来自何处。更好的方法是使用ADODB.Command对象构建参数化查询。100%同意。稍后我回到家时将编辑答案Dim testSessionID testSessionID=1020000000005 Dim script_testSessionStatus,testSessionStatus'获取testSessionID脚本的testSessionStatus=exec GetTestSession@testSessionID='&testSessionID&'忽略我的上述注释。即使将testSessionID作为字符串,也会得到相同的错误。如果我没有在testSessionID周围加引号,那么testSessionID将看起来像:exec GetTestSession at symbolTestSessionID='1.02E+18',因为这个数字1.02E+18,我的sqlstatement格式不正确。有人能帮忙吗?“我被卡住了,两天后就不能继续了。”ekkehard在那个例子中说,是的,但你认为testSessionID最终会从这里来吗?别那么天真!!该错误与将值作为字符串传递无关,该错误来自ADODB提供程序,该提供程序抱怨多步OLE DB操作。@user2329418 GWR和Ekkehard对值的看法都是正确的,您可以将其作为字符串传递,但这不是您的问题。“你试过我在书中的建议了吗?”@ekkehard从我的判断,我猜你没有抓住要点,而是选择亲自接受我的评论,这完全取决于你,但这并不意味着攻击。
"exec GetTestSession @TestSessionID ='1030000000000000005'"