【问题标题】:Convert string to uniqueidentifier in VBScript在VBScript中将字符串转换为uniqueidentifier
【发布时间】:2009-01-21 20:31:34
【问题描述】:

我有一个在我的 SQL 服务器数据库中运行存储过程的脚本,问题是存储过程需要一个 uniqueidentifier 参数。我有一个从数据库中获取会话 id 的函数(它是一个 nvarchar),所以 VBScript 将它变成一个字符串,我需要将其转换为将其传递给存储过程。


Function GetOpenSession
    Set conn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    conn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=" & Source
    rs.CursorLocation = 3
    rs.Open "SELECT top 1 OpenSession FROM OpenSessions with (nolock)" , conn, 3, 3
    If rs.RecordCount = 0 Then
        MsgBox "No Connection"
    Else
        GetOpenSession = rs.Fields(0).Value
    End If
End Function 

当我尝试执行存储过程时,我得到“强制转换规范的无效字符值”。


    set cnParam = cmd.CreateParameter("@ActiveSession",72,1,,GetOpenSession)
    cmd.Parameters.Append cnParam

我无法更改数据库中的任何内容,因此我需要在脚本中解决此问题。

【问题讨论】:

  • 你怎么知道“SELECT top 1 OpenSession FROM OpenSessions with (nolock)”会给你活动会话?无论它代表哪个会话,您只是选择第一个 OpenSession 值。
  • 此表中存储的唯一会话是活动会话,因此我使用哪个无关紧要。
  • 嗯...好吧,但如果您不关心传递给 proc 的 哪个 活动会话 ID,这听起来像是一个奇怪的架构。
  • 应用程序确实关心它只使用它自己的会话,我正在测试应用程序所以我不在乎我使用什么会话,只是有一个打开的会话。

标签: sql-server vbscript uniqueidentifier


【解决方案1】:

我相信 VBScript 期望 GUID 以大括号终止。 您的 Session id 是否与以下格式相同 {D6CA6263-E8E1-41C1-AEA6-040EA89BF030}

【讨论】:

  • 否,它也以字符串形式存储在数据库中。
【解决方案2】:

根据 SELECT OpenSession 的数据类型,您可以在查询中强制转换/转换它,VBScript 可能会将数据类型保留为 GUID:

SELECT top 1 CONVERT(uniqueidentifier, OpenSession)
FROM OpenSessions with (nolock)

当您使用 GetOpenSessionrs.Fields(0).Value 时,希望 VBScript 将其保留为 GUID。

另一种可能性似乎是使用CoCreateGuidStringFromGUID2 的Win32 API。在here 中找到了一个示例,但它需要外部 Win32 函数和 GUID 类型。

【讨论】:

  • 天才!我不敢相信我没有想到 CONVERT。
【解决方案3】:

我一般把存储过程的参数类型改成varchar(38)。

SQL Server 在需要时可以更好地将字符串强制转换为 GUID。

【讨论】:

  • 我不控制数据库,也无法更改其中的任何内容。我只是一名测试人员,开发人员不喜欢仅仅为了帮助我们而进行更改。
【解决方案4】:

GetOpenSession 赋值后的值是多少?哪种数据类型?听起来它与您在 CreateParameter 调用中声明的类型 72 (GUID) 不兼容。

【讨论】:

  • 它是一个字符串。但是,如果我尝试使用类型 8(字符串)创建参数,则会收到“将数据类型 nchar 转换为唯一标识符时出错。”
【解决方案5】:

您可以完全忘记使用 ADO 命令,而只使用普通 SQL 执行存储过程。

Set rs = CreateObject("ADODB.Recordset")
rs.Open "EXEC usp_MySP '" & GetOpenSession & "'", cnn

显然这样构建SQL命令很糟糕,但毕竟只是为了测试......

【讨论】:

  • 只是测试?!这将是一个添加到用于测试应用程序的测试套件中的例程。就像开发人员编写和维护数百万行代码以使应用程序正常工作一样,测试人员有时也会这样做以确保应用程序正常工作。所以不,这不仅仅是一个测试。
猜你喜欢
  • 2018-03-25
  • 2011-09-12
  • 2011-08-23
  • 1970-01-01
  • 2015-01-03
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多