Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在VBScript中将很长的整数传递给函数?_Sql_Sql Server_Vbscript - Fatal编程技术网

Sql 如何在VBScript中将很长的整数传递给函数?

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

我有一个非常长的数字,需要将其用作SQL语句中要执行的参数。我试图将“testSessionID”字符串转换为double或Long,函数返回Err.description。但是当我使用testSessionID=2784863时,它工作得很好

这是我的密码:

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'"