【问题标题】:SQL stored procedure not returning string value [closed]SQL存储过程不返回字符串值[关闭]
【发布时间】:2020-10-10 19:51:31
【问题描述】:

我有以下存储过程的代码。我只想返回消息,如果数据库中已经存在它应该返回消息,否则重复插入数据并显示消息完成

SQL 存储过程

ALTER PROCEDURE [dbo].[SP_AddProjectManager]
        -- Add the parameters for the stored procedure here
        @ProjectId int,
        @EmployeeId int,
        @uid nvarchar(128)
        
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
        declare @Organization_Id int = (select Organization_Id from Employees where User_Account_Id = @uid);
        declare @Office_Id int = (select Office_Id from Employees where User_Account_Id = @uid);
        declare @output nvarchar(50);
        declare @dup int =(select count(*) from Project_Managers where EmployeeId=@EmployeeId and ProjectId=@ProjectId);
        
        
    
        if(@dup=0)
            begin
                INSERT INTO [dbo].[Project_Managers]
                       ([EmployeeId]
                       ,[ProjectId]
                       ,[User_Account_Id]
                       ,[Office_Id]
                       ,[Organization_Id]
                       ,[CreatedOn]
                       ,[UpdatedOn]
                       ,[CreatedBy]
                       ,[UpdatedBy]
                       ,[Is_active]
                       )
                 VALUES(@EmployeeId,@ProjectId,@uid,@Office_Id,@Organization_Id,GETDATE(),GETDATE(),@uid,@uid,1);
                 SET @output= 'Done';
             end
         else
             begin
                SET @output ='Repeated';
             end
         return convert(varchar(10),@output)
    END

无法返回它在错误后显示的字符串值:

Msg 245, Level 16, State 1, Procedure SP_AddProjectManager, Line 43 [Batch Start Line 2]
Conversion failed when converting the varchar value 'Repeated' to data type int.

C# 代码

 public static string Add_ProjectManager(ProjectManagers PM)
        {
            using (SqlCommand cmd_insertion = new SqlCommand())
            {
                conn c = new conn();
                SqlConnection _Con = c.conect();
                cmd_insertion.Connection = _Con;
                _Con.Open();
                cmd_insertion.CommandType = System.Data.CommandType.StoredProcedure;
                cmd_insertion.CommandText = "SP_AddProjectManager";
                cmd_insertion.Parameters.AddWithValue("@ProjectId", PM.ProjectId);
                cmd_insertion.Parameters.AddWithValue("@EmployeeId", PM.EmployeeId);
                cmd_insertion.Parameters.AddWithValue("@uid", PM.userId);

                SqlParameter retval = cmd_insertion.Parameters.Add("@output", SqlDbType.VarChar);
                retval.Direction = ParameterDirection.ReturnValue;
                cmd_insertion.ExecuteNonQuery();
                string status = (string)cmd_insertion.Parameters["@output"].Value;
                _Con.Close();
                cmd_insertion.Parameters.Clear();
                return status;
            }
        }

【问题讨论】:

  • 您将@output 声明为int,而您的意思可能是nvarchar(...)。投票结束这是一个错字。
  • 它是一个存储过程,它只能返回一个int...你可以选择你的结果或传入一个OUTPUT参数并设置它。
  • 即使在使用 nvarchar 后也显示相同的错误
  • 亲爱的,我已经更新了代码它也有同样的错误
  • 如果您愿意,可以使用 print(output) 并在消息选项卡中查看

标签: c# sql asp.net sql-server stored-procedures


【解决方案1】:

使用OUTPUT 参数,像这样...(免责声明,不在 sql 编辑器前面)

ALTER PROCEDURE [dbo].[SP_AddProjectManager]
        -- Add the parameters for the stored procedure here
        @ProjectId int,
        @EmployeeId int,
        @uid nvarchar(128),
        @output nvarchar(50) OUTPUT
        
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
        declare @Organization_Id int = (select Organization_Id from Employees where User_Account_Id = @uid);
        declare @Office_Id int = (select Office_Id from Employees where User_Account_Id = @uid);
        declare @output nvarchar(50);
        declare @dup int =(select count(*) from Project_Managers where EmployeeId=@EmployeeId and ProjectId=@ProjectId);
        
        
    
        if(@dup=0)
            begin
                INSERT INTO [dbo].[Project_Managers]
                       ([EmployeeId]
                       ,[ProjectId]
                       ,[User_Account_Id]
                       ,[Office_Id]
                       ,[Organization_Id]
                       ,[CreatedOn]
                       ,[UpdatedOn]
                       ,[CreatedBy]
                       ,[UpdatedBy]
                       ,[Is_active]
                       )
                 VALUES(@EmployeeId,@ProjectId,@uid,@Office_Id,@Organization_Id,GETDATE(),GETDATE(),@uid,@uid,1);
                 SET @output= 'Done';
             end
         else
             begin
                SET @output ='Repeated';
             end
       
    END

你会这样称呼它......

DECLARE @output varchar(50);
EXEC [dbo].[SP_AddProjectManager] 6, 66, '81873272', @output OUTPUT
SELECT @output 
-- OR
PRINT @Output

或者,如果您不想要输出参数,请将“RETURN”语句替换为“SELECT”

你的 C# 代码,再次,没有使用编辑器,所以在我的脑海中......

public static string Add_ProjectManager(ProjectManagers PM)
{
    using (SqlCommand cmd_insertion = new SqlCommand())
    {
        using (conn c = new conn()) // Whatever this is
        {
            using (SqlConnection _Con = c.conect())
            {
                cmd_insertion.Connection = _Con;
                cmd_insertion.CommandType = System.Data.CommandType.StoredProcedure;
                cmd_insertion.CommandText = "SP_AddProjectManager";
                cmd_insertion.Parameters.AddWithValue("@ProjectId", PM.ProjectId); // .AddWithValue() is bad
                cmd_insertion.Parameters.AddWithValue("@EmployeeId", PM.EmployeeId);
                cmd_insertion.Parameters.AddWithValue("@uid", PM.userId);

                SqlParameter retval = cmd_insertion.Parameters.Add("@output", SqlDbType.VarChar);
                retval.Direction = ParameterDirection.Output;

                _Con.Open();

                cmd_insertion.ExecuteNonQuery();
                string status = retval.Value;
                _Con.Close();
                return status;
            }
        }
    }
}

【讨论】:

  • 我应该添加相同的存储过程吗?对不起,我不明白,请详细说明
  • 第一个代码示例是您的存储过程,带有一个输出参数。第二个示例是如何从 SQL 中调用它。你是如何使用存储空间的?结果是用来做什么的?
  • 我想在asp.net代码中调用SqlParameter retval = cmd_insertion.Parameters.Add("@output",SqlDbType.VarChar); retval.Direction = ParameterDirection.ReturnValue;
  • 啊...您在帖子中没有提到 C#。因此,将您的ParameterDirection.ReturnValue 替换为ParameterDirection.Output...执行代码中的存储过程,然后您可以访问retval.Value 或者,在您的问题中发布您的C# 代码,我会更正它
  • 请检查编辑后的答案@amaddurrani
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多