存储过程返回错误的ID guid

时间:2016-08-08 16:58:35

标签: c# sql-server

我需要一些帮助。下面的存储过程似乎与现有的唯一标识符

不匹配
ALTER PROCEDURE [dbo].[spInsertUpdateThisStuff]
    @Id uniqueidentifier OUTPUT,
    @Content nvarchar(255)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @tAudit table (id uniqueidentifier)

    IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id)
    --  UPDATE
    BEGIN
        UPDATE [dbo].[myData] 
        SET [ID] = @ID,
            [Content] = @Content
        OUTPUT inserted.[ID] INTO @tAudit
        WHERE [ID] = @Id

        SELECT id FROM @tAudit
    END
    ELSE
    BEGIN
        --  INSERT
        SET @ID = NEWID()

        INSERT INTO [dbo].CBData ([ID], [Content])
        OUTPUT inserted.[ID] INTO @tAudit
        VALUES(@Id, @Content)

        SELECT id FROM @tAudit
    END;

    SET @ID = (SELECT id FROM @tAudit);
END

C#

cmd.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = (currentRecord.ID == null) ? Guid.Empty : currentRecord.ID;
cmd.Parameters["@ID"].Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
currentRecord.ID = Guid.Parse(cmd.Parameters["@ID"].Value.ToString());

似乎第一个IF语句永远不会成为现实,但如果使用匹配的UID测试(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id),它将返回数据。

3 个答案:

答案 0 :(得分:1)

这句话有问题,

 DECLARE @tAudit table (id uniqueidentifier)
    IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id)
    --  UPDATE
         BEGIN

@id是一个输出参数,默认为null,您正在尝试检查..

基本上NEWID()不会重复,因此更新部分是多余的

答案 1 :(得分:0)

您如何在代码中声明参数?是ParameterDirection.Output吗?

尝试将其更改为ParameterDirection.InputOutput。你的SQL看起来没问题。并且可以将输入值传递给存储过程中声明为OUTPUT的参数。所以也许只是ParameterDirection

您也可以更改此

IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id)

IF @Id IS NOT NULL AND EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id)

如果您的ID列无法使用,那么无论哪种方式都可以使用相同的ID列。但这更加明确,表明它已经认识到@Id可能是null,因为它是一个OUTPUT参数。

答案 2 :(得分:0)

这是我的修复。 这是我的新存储过程

ALTER PROCEDURE [dbo].[spInsertUpdatemyData]
    @ID uniqueidentifier,
    @IDOut uniqueidentifier OUTPUT,
    @CONTENT nvarchar(255)
AS

BEGIN
    --SET NOCOUNT ON;
    DECLARE @tAudit table (outputID uniqueidentifier)
    IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @ID)
    --  UPDATE
        BEGIN
            UPDATE [dbo].[CBData] 
            SET     [ID] = @ID,
                    [Content] = @Content
            OUTPUT inserted.[ID] INTO @tAudit
            WHERE [ID] = @ID
        SELECT outputID FROM @tAudit;
          END
    ELSE
        BEGIN
    --  INSERT
        INSERT INTO [dbo].myData
               ([ID],[Content])
            OUTPUT  inserted.[ID] INTO @tAudit
            VALUES(NEWID(),@Content);
            SELECT outputID FROM @tAudit
        END;
        set @IDOut = (SELECT outputID FROM @tAudit);
END

和相对C#

 //Add Parameter for output to sql command then Change Direction of parameter 
 cmd.Parameters.Add("@IDOut", SqlDbType.UniqueIdentifier).Value = Guid.Empty ;
 cmd.Parameters["@IDOut"].Direction = ParameterDirection.InputOutput;
 cmd.ExecuteNonQuery();
 currentRecord.ID = Guid.Parse(cmd.Parameters["@IDOut"].Value.ToString());
 cmd.Transaction.Commit();