none
使用uniqueidentifier作为参数时存在的疑惑? RRS feed

  • 问题

  • 使用uniqueidentifier出现以下的问题,在传值时必须要加单引号

    存储过程调用代码:

                SqlParameter[] parameters = { new SqlParameter("@RoleID", SqlDbType.UniqueIdentifier) };
                parameters[0].Value =  roleId ;

    执行后查询没有结果!

    存储过程写法:

    create    PROCEDURE [dbo].[sp_Test]
    @UserID UniqueIdentifier
    AS

    select * from Accounts_Users
    where UserID= @UserID  


    执行代码:

     

    1.

    DECLARE @RC int
    DECLARE @UserID uniqueidentifier
    SELECT @UserID = {BA88C88C-89F9-4C67-A4DF-2AE4CA48FBE6}
    EXEC @RC = [SMS].[dbo].[sp_Test] @UserID
    DECLARE @PrnLine nvarchar(4000)
    PRINT '存储过程: SMS.dbo.sp_Test'
    SELECT @PrnLine = ' 返回代码 = ' + CONVERT(nvarchar, @RC)
    PRINT @PrnLine

    这段代码执行会报错:[Microsoft][ODBC SQL Server Driver]语法错误或违反访问规则

    2.代码加单引号修改后

    DECLARE @RC int
    DECLARE @UserID uniqueidentifier
    SELECT @UserID = ‘{BA88C88C-89F9-4C67-A4DF-2AE4CA48FBE6}’
    EXEC @RC = [SMS].[dbo].[sp_Test] @UserID
    DECLARE @PrnLine nvarchar(4000)
    PRINT '存储过程: SMS.dbo.sp_Test'
    SELECT @PrnLine = ' 返回代码 = ' + CONVERT(nvarchar, @RC)
    PRINT @PrnLine

    就能顺利执行



    • 已编辑 sjgkkk 2011年12月30日 8:07
    2011年12月30日 7:35

全部回复

  • 要赋值给uniqueidentifier类型字段的话,请用NEWID()

    Reference:

    http://msdn.microsoft.com/zh-cn/library/ms190348.aspx


    2011年12月30日 15:35
  • You should use the way that sql supports.
    2011年12月30日 18:47
  • 要赋值给uniqueidentifier类型字段的话,请用NEWID()

    Reference:

    http://msdn.microsoft.com/zh-cn/library/ms190348.aspx



    别误导人了,newid不是干这个用处的。

    文档中说得很清楚,通过从 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 形式的字符串常量进行转换,因为是字符串常量,所以要加单引号。

    用SqlParameter是可以的,你其它地方没写对,没有完整代码,也不知道你错在什么地方。

     


    想不想时已是想,不如不想都不想。
    2011年12月31日 3:08
    版主

  • 别误导人了,newid不是干这个用处的。

    文档中说得很清楚,通过从 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 形式的字符串常量进行转换,因为是字符串常量,所以要加单引号。

    用SqlParameter是可以的,你其它地方没写对,没有完整代码,也不知道你错在什么地方。

     


    想不想时已是想,不如不想都不想。

    感谢怡红公子的纠正
    2012年1月3日 1:53
  • 要赋值给uniqueidentifier类型字段的话,请用NEWID()

    Reference:

    http://msdn.microsoft.com/zh-cn/library/ms190348.aspx



    别误导人了,newid不是干这个用处的。

    文档中说得很清楚,通过从 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 形式的字符串常量进行转换,因为是字符串常量,所以要加单引号。

    用SqlParameter是可以的,你其它地方没写对,没有完整代码,也不知道你错在什么地方。

     


    想不想时已是想,不如不想都不想。


    怡红公子,你好,谢谢你的解答!

    现在主要问题其实不在于代码的完整问题,现在主要问题是新创建的存储过程,在SQL Server中传入这样的 {BA88C88C-89F9-4C67-A4DF-2AE4CA48FBE6}值时就会直接报错:[Microsoft][ODBC SQL Server Driver]语法错误或违反访问规则

     如果传值为'{BA88C88C-89F9-4C67-A4DF-2AE4CA48FBE6}'(加单引号)后就能正确执行,

    问题恰恰出在这里了程序默认传入的值时不带单引号,如何添加前后添加单引号?试验了很多方式都不行

     



    2012年1月4日 7:53
  • 不知道你在说啥,你把完整的.net代码以及sql代码贴出来,才知道你哪里写错了。
    想不想时已是想,不如不想都不想。
    2012年1月4日 13:20
    版主
  • 你的赋值语句不正确。

    建议参考官方文档:

    http://msdn.microsoft.com/en-us/library/ms187942.aspx

    赋值的两种形式:

    DECLARE @myid uniqueidentifier = NEWID();
    SELECT CONVERT(char(255), @myid) AS 'char';
    
    DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
    SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;
    你用{}是不行的!

    DECLARE @RC int
    DECLARE @UserID uniqueidentifier
    SELECT @UserID = {BA88C88C-89F9-4C67-A4DF-2AE4CA48FBE6}


    2012年7月7日 13:24
    版主
  • 最重要的应该是这句话:
    Because the uniqueidentifier type is limited to 36 characters

    http://msdn.microsoft.com/en-us/library/ms187942.aspx

    2012年7月7日 13:33
    版主