也许这是一个显而易见的问题,但我的代码存在问题,无法获取数据库表的信息。例如,我有两个名为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;
}
}
我没有想法......有人可以帮助我吗?
答案 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方法将返回受影响的行数 INSERT,DELETE或UPDATE操作。这个ExecuteNonQuery方法会 仅用于插入,更新和删除,创建和SET 语句。
SqlCommand.ExecuteNonQuery MSDN
Execute Reader将用于在执行时返回行集 使用命令对象的SQL查询或存储过程。这个是 仅转发记录的检索,并用于读取表格 从头到尾的价值观。
Execute Scalar将返回单行单列值,即单行 使用命令执行SQL查询或存储过程时的值 宾语。从数据库中检索单个值非常快。
答案 2 :(得分:-1)
马可,
您似乎正在运行。在o_prod
对象上暂停,然后尝试从中获取一些结果。这不是一个好的答案,但请尝试评论o_prod.Dispose()
另外一件事是你没有将结果分配给你的obtener函数中的任何东西。