如何使用存储过程结果 return 在 ASP.NET MVC 中将项目列为 JSON?

How to return list item as JSON in ASP.NET MVC using stored procedure result?

我想 return 来自 SQL 服务器的一些数据 table;我使用了这样的存储过程:

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);

但是代码报错:

Conversion failed when converting the varchar value 'Charpy Impact Test' to data type int.

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

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

Conversion failed when converting the varchar value 'Charpy Impact Test' to data type int.

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

want to do is return the table data as JSON

您的代码:

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

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

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

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

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

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

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

我找不到导致错误的原因,但传递包括 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();