我想从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();