存储过程GET

时间:2015-11-03 18:49:25

标签: c# sql-server stored-procedures

也许这是一个显而易见的问题,但我的代码存在问题,无法获取数据库表的信息。例如,我有两个名为Productos&的表。 Proveedores。我创建了一个存储过程来获取一个表的数据,以便用API显示,但是(PostMan Software)当我使用时

GET http://localhost:4716/api/Proveedor    show me "null"

以下是SQL Server存储过程的代码:

IF EXISTS(SELECT 1 FROM sys.objects WHERE type = 'P' AND name =         'SP_GetProd')
BEGIN
    DROP PROCEDURE SP_GetProd
END
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE SP_GetProd
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT * FROM [dbo].[TblProducto] 
END
GO

我确实为Proveedores创建了其他程序:

IF EXISTS(SELECT 1 FROM sys.objects WHERE type = 'P' AND name =     'SP_GetProve')
BEGIN
     DROP PROCEDURE SP_GetProve
END
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE SP_GetProve
    -- Add the parameters for the stored procedure here

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT * FROM [dbo].[TblProveedores]
END
GO

在C#代码中我有这个调用方法:

 public HttpResponseMessage Get([FromBody] Productores.Models.Producto prod)
 { 
            Productores.Productores o_prod = new Productores.Productores(ConfigurationManager.AppSettings["sqlCnn"].ToString());
            o_prod.obtener(prod);
            o_prod.Dispose();
            return Request.CreateResponse<Productores.Models.Producto>(HttpStatusCode.Created, prod);
 }

/*/*/*/*/*/*/*/*/*/*/*/*/

public void obtener (Models.Producto objProducto)
{
        try
        {
            CreateConnection();
            mSqlCommand = new SqlCommand();
            mSqlCommand.Connection = mSqlConnection;
            mSqlCommand.CommandText = "SP_GetProd";
            mSqlCommand.CommandType = CommandType.StoredProcedure;

            mSqlCommand.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            throw ex;
        }
}

我没有想法......有人可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

ExecuteNonQuery不是从表中检索数据的正确方法。此方法用于INSERT / UPDATE / DELETE调用而不是SELECT。它执行存储过程,但不返回表中的数据。通常ExecuteNonQuery返回受查询影响的记录数,但在此上下文中不清楚返回值是什么。

您需要使用ExecuteReader调用,但是您需要提供Producto的列表,因为您不会使用某种WHERE条件来限制结果,因此,ExecuteReader将返回表格中的每条记录。如果这是您想要的,则需要将代码更改为

public void obtener (List<Models.Producto> prods)
{
    try
    {
        CreateConnection();
        mSqlCommand = new SqlCommand();
        mSqlCommand.Connection = mSqlConnection;
        mSqlCommand.CommandText = "SP_GetProd";
        mSqlCommand.CommandType = CommandType.StoredProcedure;

        // Here the SP will be executed and the result is ready
        using(SqlDataReader reader = mSqlCommand.ExecuteReader())
        {
            // Move the reader on the first/next record until there are records
            while(reader,Read())
            {
                 // Create one empty Producto 
                 Models.Producto aSingleProd = new Models.Producto();

                 // Set every property of the Producto with the 
                 // values from the fields returned by the SP
                 aSingleProd.Property1 = reader["Field1"].ToString();
                 .... other property of your Producto
                 prods.Add(aSingleProd);
            }
        }

    }
    catch (Exception ex)
    {
        throw ex;
    }
}

作为旁注,请不要以这种方式处理连接和命令。更好地使用局部变量并在使用它们之后处理它们(就像我在SqlDataReader情况下所做的那样)。如果您保留示例中的全局对象,则会遇到问题处理连接状态并在不再需要时处置它。

最后一个问题是存储过程的名称。最好不要使用前缀SP,因为Microsoft声明此前缀是为系统存储过程保留的,虽然不太可能存在与Microsoft定义的系统存储过程冲突的可能性

答案 1 :(得分:0)

在您的上述情况中,您需要使用ExecuteReader

的ExecuteNonQuery

  

ExecuteNonQuery方法将返回受影响的行数   INSERT,DELETE或UPDATE操作。这个ExecuteNonQuery方法会   仅用于插入,更新和删除,创建和SET   语句。

SqlCommand.ExecuteNonQuery MSDN

的ExecuteReader

  

Execute Reader将用于在执行时返回行集   使用命令对象的SQL查询或存储过程。这个是   仅转发记录的检索,并用于读取表格   从头到尾的价值观。

SqlCommand.ExecuteReader MSDN

执行标量

  

Execute Scalar将返回单行单列值,即单行   使用命令执行SQL查询或存储过程时的值   宾语。从数据库中检索单个值非常快。

SqlCommand.ExecuteScalar MSDN

答案 2 :(得分:-1)

马可, 您似乎正在运行。在o_prod对象上暂停,然后尝试从中获取一些结果。这不是一个好的答案,但请尝试评论o_prod.Dispose()

另外一件事是你没有将结果分配给你的obtener函数中的任何东西。