如何使用存储过程结果在 MVC 中将列表项作为 JSON 返回 ASP.NET?



我想从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 值"夏比冲击测试"转换为数据类型 int 时转换失败。

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

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

将 varchar 值"夏比冲击测试"转换为数据类型 int 时转换失败。

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

想要做的是将表数据作为 JSON 返回

您的代码:

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

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

您的代码可能存在一些问题。

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

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

关于您得到的实际错误... 检查您的 LibraryMediaEntry 对象。 正在填充的属性是否偶然成为整数? 这可能就是问题所在。

最后,您存储的过程。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();