为啥数据没有从存储过程存储到数据库中?

Posted

技术标签:

【中文标题】为啥数据没有从存储过程存储到数据库中?【英文标题】:Why is data not stored in database from stored procedure?为什么数据没有从存储过程存储到数据库中? 【发布时间】:2017-10-17 09:42:25 【问题描述】:

我正在使用实体框架,我正在尝试使用此存储过程在 SQL Server 中存储一些数据:

create procedure [dbo].[Sp_OrderList]
    @OrderId int,
    @OrderName varchar(50),
    @OrderData datetime 
As
Begin
    Insert into OrderList (OrderId, OrderName, OrderDate)    
    values (@OrderId, @OrderName, @OrderData)
End

C#代码:

public HttpResponseMessage SaveCountry(OrderList cnt)

    OrderList Cntrcountr = new OrderList();
    Cntrcountr.OrderId = cnt.OrderId;
    Cntrcountr.OrderName = cnt.OrderName;
    Cntrcountr.OrderDate = cnt.OrderDate;

    var param = new SqlParameter("",Cntrcountr);
    var country = db.Database.SqlQuery<string>("Sp_OrderList", Cntrcountr);

    return Request.CreateResponse(HttpStatusCode.OK, country);

我遇到了一个错误

500 内部服务器错误

请帮助我 - 我的错误是什么?

【问题讨论】:

旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀! 您应该学习如何找出错误所在。见this question。 【参考方案1】:

由于您的存储过程实际上不返回任何数据,您应该使用ExecuteSqlCommand 方法。试试这个:

db.Database.ExecuteSqlCommand(
    "EXEC Sp_OrderList @OrderId, @OrderName, @OrderData",
    new SqlParameter("@OrderId", cnt.OrderId),
    new SqlParameter("@OrderName", cnt.OrderName), 
    new SqlParameter("@OrderData", cnt.OrderData));

【讨论】:

获取错误作为附加信息:'@OrderName' 附近的语法不正确。【参考方案2】:

Database.SqlQuery 将 sql 和参数作为数组。您正在传递一个复杂的对象并期望将属性转换为参数。见Database.SqlQuery documentation。

public HttpResponseMessage SaveCountry(OrderList cnt)

    var country = db.Database.SqlQuery<string>("exec Sp_OrderList @OrderId, @OrderName, @OrderData", cnt.OrderId, cnt.OrderName, cnt.OrderDate);

    return Request.CreateResponse(HttpStatusCode.OK, country);

也就是说 500 状态的原因是因为您的服务器代码遇到了未处理的异常。您应该添加日志记录或学习如何调试服务器端代码,以便在发生异常时检查异常。

【讨论】:

这里我们不提供任何列然后当我执行上面的查询时它如何工作 sql 性能生成 exec sp_executesql N'Sp_OrderList',N'@p0 int,@p1 nvarchar(1),@p2 datetime',@p0=123,@p1=N'q',@p2='2015-01-01 00:00:00' 错误,因为过程或函数 'Sp_OrderList' 需要参数 '@OrderId',但未提供.

以上是关于为啥数据没有从存储过程存储到数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的存储过程没有出现在我的 SQL Server 数据库中?

为啥要使用存储过程?

使用spring从db2数据库调用存储过程到java代码

为啥存储过程没有在一个字符串中给出输出并且在 MySql 6.0 上执行的存储过程在 MySql 5.0 上给出错误

存储过程从服务器 A 中选择数据并将数据插入到服务器 B

oracle数据库的存储过程中可以用到隐形游标。但是我不太明白为啥可以用 for in loop来完成对数据的处理。