【问题标题】:How to return list item as JSON in ASP.NET MVC using stored procedure result?如何使用存储过程结果在 ASP.NET MVC 中将列表项作为 JSON 返回?
【发布时间】:2019-12-09 06:58:26
【问题描述】:

我想从 SQL Server 表中返回一些数据;我使用了这样的存储过程:

ALTER PROCEDURE [dbo].[SP_TITILESEARCH]
    (@FLAG INT, 
     @Author VARCHAR(300) = NULL,
     @Category VARCHAR(100) = NULL,
     @Title VARCHAR(MAX) = NUll)
AS
BEGIN
    IF (@FLAG = 1)
    BEGIN
        SELECT * 
        FROM SmartLibClientDB.dbo.LibraryMediaEntry 
        WHERE Title LIKE '%' + @Title + '%' 
    END
END

在服务器端,存储过程是这样执行的:

var media = new LibraryMediaEntry();
var db = new SchooberrySchoolEntities();

SqlParameter param1 = new SqlParameter("@Title", "Charpy Impact Test");
SqlParameter param2 = new SqlParameter("@FLAG", 1);

media = db.Database.SqlQuery<LibraryMediaEntry>("exec SP_TITILESEARCH @Title, @FLAG", param1, param2)
                   .ToList()
                   .FirstOrDefault();   // Getting error when executed
return Json(media, JsonRequestBehavior.AllowGet);

但是代码抛出错误:

将 varchar 值“Charpy Impact Test”转换为数据类型 int 时转换失败。

我想要做的是将表数据返回为JSON 这是正确的方法吗?或者为什么会出错?我不明白我做错了什么,因为要求转换为int 的错误列实际上是varchar

注意:我使用的是存储过程,因为我返回的数据来自同一服务器上的不同数据库

【问题讨论】:

标签: c# stored-procedures sql-server-2012


【解决方案1】:

将 varchar 值“Charpy Impact Test”转换为数据类型 int 时转换失败。

这意味着@Title 参数需要int(整数)。 Charpy Impact Test 不是整数,因此您的存储过程调用失败。选择一个整数值是第一步。

想要做的是将表格数据以 JSON 格式返回

您的代码:

 media = db.Database.SqlQuery<LibraryMediaEntry>("exec SP_TITILESEARCH @Title,@FLAG"
  ,param1
  ,param2)
  .ToList()
  .FirstOrDefault();

正在调用.FirstOrDefault(),这将导致媒体中出现单行。您是否打算返回一条记录?

【讨论】:

  • 我已经更新了我的存储过程,我已经将 @Title 定义为 varchar(Max) 为什么那么它期望 int
  • 我什至不知道如何回答这个问题。我唯一能想到的是,您是在暗示计算机在对错误信息撒谎吗?
【解决方案2】:

您的代码可能存在几个问题。

您的存储过程参数@FLAG 定义为varchar(25)。然而,在填充它时,您传递的是一个整数 (SqlParameter param2 = new SqlParameter("@FLAG",1);)。将其更改为:

var param2 = new SqlParameter("@FLAG", "1");

关于您遇到的实际错误...检查您的 LibraryMediaEntry 对象。被填充的属性是int吗?这可能就是问题所在。

最后,您的存储过程。 SELECT * FROM 是存储过程中的错误形式。指定所需的实际字段。它还有助于调试。

【讨论】:

    【解决方案3】:

    我找不到导致错误的原因,但传递包括 null 在内的所有参数都为我完成了这项工作

    var DB = new dbEntities();
                        SqlParameter param1 = new SqlParameter("@FLAG", 1);
                        SqlParameter param2 = new SqlParameter("@Author", "");
                        SqlParameter Param3 = new SqlParameter("@Category", "");
                        SqlParameter param4 = new SqlParameter("@Title", Convert.ToString(id));
                        var medias = db.Database.SqlQuery<LibraryMediaEntry>("exec SP_TITILESEARCH @FLAG,@Author,@Category,@Title", param1, param2, Param3, param4).ToList();
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2013-05-26
      • 2017-09-29
      • 2014-06-26
      • 2018-07-31
      相关资源
      最近更新 更多