2012-05-20 116 views
0

我有存储过程,它将xml作为输入。ExecuteNonQuery返回的是随机数而不是返回实际行

的C#代码执行SP是

using (SqlConnection conn = new SqlConnection(connString)) 
{ 
    try 
    { 
     conn.Open(); 
     SqlCommand command = new SqlCommand("sp_Configure_Users", conn); 
     command.CommandType = CommandType.StoredProcedure; 
     var xmlData = new SqlParameter(parameterName: "@XMLDATA", value: GenerateXML(_userDetails)); 
     command.Parameters.Add(xmlData); 

     count = command.ExecuteNonQuery(); 
     if (count > 0) 
     { 
      return count; 
     } 
     else 
     { 
      return 0; 
     } 
    } 
    catch (SqlException ) 
    { 

    } 
} 

GenerateXML返回一个字符串,它是。在我的存储过程中我已删除SET NOCOUNT基于XML数据的形式返回我实际没有的方法当插入,删除或更新。如果我运行与样本XML数据查询列: -

<UserCollection> 
    <InsertList><Users User_Id="438" First_Name="Praveen" Middle_Name="" Last_Name="Kumar" Designation_Id="1" Email="" Contact_Number="96533" Updated_By="pkumar" /> 
    </InsertList> 
    <UpdateList></UpdateList> 
    <DeleteList></DeleteList> 
</UserCollection> 

返回的值是3而不是1如在我的收藏IM只传递单排,其需要是插入。因为没有更新或删除的行SP只能返回1时能返回3吗?

存储的过程是

set ANSI_NULLS ON 
    set QUOTED_IDENTIFIER ON 
    go 



    ALTER PROCEDURE [dbo].[sp_Configure_Users] 
@XMLDATA xml 
    AS 
DECLARE @Users_Staging Table(
[User_Id] [int] NOT NULL, 
[First_Name] [varchar](200) NOT NULL, 
[Middle_Name] [varchar](200) NULL, 
[Last_Name] [varchar](200) NOT NULL, 
[Designation_Id] [int] NOT NULL, 
[Email] [varchar](250) NOT NULL, 
[Contact_Number] [varchar](50) NOT NULL, 
[Updated_By] [varchar](255) NOT NULL 
) 

    BEGIN 

    Set nocount off 
    Go  

    BEGIN TRY 
    BEGIN TRANSACTION 


    DECLARE @CurrDate datetime; 
    SELECT @CurrDate = GETDATE(); 
    -- Insert statements for procedure 
    INSERT INTO Users 
    ([User_Id] 
    ,[First_Name] 
    ,[Middle_Name] 
    ,[Last_Name] 
    ,[Designation_Id] 
    ,[Email] 
    ,[Contact_Number] 
    ,[Updated_By] 
    ,[Updated_Date] 
) 
    Select  
XMLDATA.item.value('@User_Id[1]', 'int') AS User_Id,  
XMLDATA.item.value('@First_Name[1]', 'varchar(200)') AS First_Name, 
XMLDATA.item.value('@Middle_Name[1]', 'varchar(200)') AS Middle_Name, 
XMLDATA.item.value('@Last_Name[1]', 'varchar(200)') AS Last_Name, 
XMLDATA.item.value('@Designation_Id[1]', 'int') AS Designation_Id, 
XMLDATA.item.value('@Email[1]', 'varchar(250)') AS Email, 
XMLDATA.item.value('@Contact_Number[1]', 'varchar(50)') AS Contact_Number, 
XMLDATA.item.value('@Updated_By[1]', 'varchar(255)') AS Updated_By, 
@CurrDate 
    FROM @XMLDATA.nodes('//UserCollection/InsertList/Users') AS XMLDATA(item) 

    -- Update statements for procedure 

    INSERT INTO @Users_Staging 
     ([User_Id] 
    ,[First_Name] 
    ,[Middle_Name] 
    ,[Last_Name] 
    ,[Designation_Id] 
    ,[Email] 
    ,[Contact_Number] 
    ,[Updated_By]) 

Select 
XMLDATA.item.value('@User_Id[1]', 'int') AS User_Id,  
XMLDATA.item.value('@First_Name[1]', 'varchar(200)') AS First_Name, 
XMLDATA.item.value('@Middle_Name[1]', 'varchar(200)') AS Middle_Name, 
XMLDATA.item.value('@Last_Name[1]', 'varchar(200)') AS Last_Name, 
XMLDATA.item.value('@Designation_Id[1]', 'int') AS Designation_Id, 
XMLDATA.item.value('@Email[1]', 'varchar(250)') AS Email, 
    XMLDATA.item.value('@Contact_Number[1]', 'varchar(50)') AS Contact_Number, 
XMLDATA.item.value('@Updated_By[1]', 'varchar(255)') AS Updated_By 
    FROM @XMLDATA.nodes('//UserCollection/InsertList/Users') AS XMLDATA(item) 


    UPDATE Users 
    SET First_Name=stgusr.First_Name, 
    Middle_Name=stgusr.Middle_Name, 
    Last_Name=stgusr.Last_Name, 
    Email=stgusr.Email, 
    Contact_Number=stgusr.Contact_Number, 
    Updated_By=stgusr.Updated_By, 
    [email protected] 
    FROM Users usr INNER JOIN 
    @Users_Staging stgusr 
    ON usr.User_Id=stgusr.User_Id 

-- Delete statements for procedure 

    DELETE Users 
    WHERE User_Id 
    IN (Select   
    XMLDATA.item.value('@User_Id[1]', 'int') AS User_Id 
FROM @XMLDATA.nodes('//UserCollection/DeleteList/Users') AS XMLDATA(item)) 

    COMMIT TRANSACTION; 

    END TRY 

    BEGIN CATCH 
--EXEC sp_rethrow_error; 
ROLLBACK TRANSACTION; 
    END CATCH; 
    END 
+1

无法看到存储过程的代码而无法回答。 – Joe

+0

@Joe,也许不是不可能的:)。 Praveen:请修改你的头衔;一个随机数很可能不会被返回。 –

+0

这个问题已经更新 – praveen

回答

1

如果你有更新的表触发器/你的存储过程插入,它们会影响受影响的行数:

对于UPDATE,INSERT和DELETE语句,返回值是该命令影响的行数的 。当插入或更新的 表中存在触发器时,返回值包括受插入或更新操作影响的行的编号 以及受触发器或触发器影响的行的编号 。对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回值 的值也是-1。
Ref

建议您发布相关表的存储过程和模式/触发器。

+0

在我看来,如果我只通过一行插入作为xml输入,即使有更新和删除有任何行,SP也会返回我3。我已经发布了SP – praveen

+0

的代码最后我找到了解决方案。我存储的Proc中有一个错误。在更新表格时,我从InsertList中取出了来自XML输入的UpdateList的值。 FROM @ XMLDATA.nodes( '// UserCollection/InsertList /用户')AS XMLDATA(项目) 它应该是 FROM @ XMLDATA.nodes( '// UserCollection/UpdateList /用户')AS XMLDATA(项目) 对不起浪费你所有的时间家伙。刚发现做单元测试有多重要:) – praveen

相关问题