【问题标题】:ASP.NET Stored Procedure method not workingASP.NET 存储过程方法不起作用
【发布时间】:2015-09-26 01:56:42
【问题描述】:

我有一个调用存储过程的方法:

public List<BarcodeClass> CheckTagId(int tagId)
{
    barcodes = new List<BarcodeClass>();
    try
    {
        using (SqlCommand command = new SqlCommand("uspCheckTagId", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            SqlParameter parameter = new SqlParameter("@TG", SqlDbType.Int)
            {
                Direction = ParameterDirection.Input,
                Value = tagId
            };
            command.Parameters.Add(parameter);
            connection.Open();
            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
            }
        }
    }
    finally
    {
        connection.Close();
    }
    
    return barcodes;
}

我的问题是这不起作用。我刚刚收到此消息:发生错误。我知道它不是与数据库的连接,因为如果我将存储过程名称更改为另一个存储过程,它不会返回该错误消息。我感觉它与这部分有关:

    

SqlParameter parameter = new SqlParameter("@TG", SqlDbType.Int)
{
    Direction = ParameterDirection.Input,
    Value = tagId
};

因为我传入了一个 int,如果我使用另一个带有 NVarChar 的存储过程并传入一个字符串,这将有效!我将 int 作为参数传递的方式有问题吗?

这是存储过程:

    declare @TG int

    declare @L1R nchar(10) -- Label1 Return Variable
    declare @L2R nchar(10) -- Label2 Return Variable
    declare @L3R nchar(10) -- Label3 Return Variable
    declare @L4R nchar(10) -- Label4 Return Variable
    declare @LD1R nchar(15) -- LData1 Return Variable
    declare @LD2R nchar(15) -- LData2 Return Variable
    declare @LD3R nchar(15) -- LData3 Return Variable
    declare @LD4R nchar(15) -- LData4 Return Variable
    set @TG = 10001
    exec uspCheckTagId @TG, @L1 = @L1R output, @L2 = @L2R output, @L3 = @L3R output, @L4 = @L4R output,  @LD1 = @LD1R output, @LD2 = @LD2R output, @LD3 = @LD3R output, @LD4 = @LD4R output
    print @L1R
    print @L2R
    print @L3R
    print @L4r
    print @LD1R
    print @LD2R
    print @LD3R
    print @LD4r

请帮忙!我无法调试这个,因为数据库只在我推送到的服务器上工作,我无权访问这个服务器。

【问题讨论】:

  • 完整的 proc 定义是什么,特别是带有参数声明的顶部?您发布的是变量声明,而不是参数声明。至少在我见过的所有存储过程中。
  • 你只添加了一个输入参数,但是从SQL代码中的过程调用来看,输出参数也有8个。
  • 捕获实际错误的 catch 块将有助于故障排除。

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


【解决方案1】:

在sql server中创建SP的语法是:

CREATE PROCEDURE [schema].[procName]
    @param1 int, 
    @param2 bit
AS
BEGIN
    -- SP Logic
    declare @someVar int, -- note this is a variable, not a parameter.
            @anotherVar varchar(10)

    -- select, updates, deletes, etc
END

您发布的过程定义(不完整)没有参数名称@TG,而是一个变量。如果您更正您的过程以遵循上述示例,使用参数而不是变量,那应该可以解决您的直接问题。

此外,根据您的代码 cmets,它看起来就像您正在尝试使用输出参数。这些需要在 SP 声明中设置(就像普通参数一样),但需要使用 outoutput 修饰符。

看来你想要这样的东西:

create procedure mySpName
    @TG int, -- input parameter
    @L1R nchar(10) out, -- output parameter -- Label1 Return Variable
    @L2R nchar(10) out, -- Label2 Return Variable
    @L3R nchar(10) out, -- Label3 Return Variable
    @L4R nchar(10) out, -- Label4 Return Variable
    @LD1R nchar(15) out, -- LData1 Return Variable
    @LD2R nchar(15) out, -- LData2 Return Variable
    @LD3R nchar(15) out, -- LData3 Return Variable
    @LD4R nchar(15) out -- LData4 Return Variable
AS
BEGIN
    -- SP body
END

要在您的 c# 代码中使用参数,您可以使用示例:

添加参数:

SqlParameter output = new SqlParameter("@L1R", SqlDbType.NVarChar);
output.Direction = ParameterDirection.Output;
cmd.Parameters.Add(output);

读取参数:

string L1R = cmd.Parameters["@L1R"].Value.ToString();

【讨论】:

  • 我无法调整存储过程。我尝试将所有 8 个输出作为参数添加......仍然没有工作@Krittner 我如何传递一个值而不是你说的参数?
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2012-04-07
  • 1970-01-01
相关资源
最近更新 更多