【发布时间】:2018-07-12 11:43:09
【问题描述】:
我编写了以下 C# 代码来从我的数据库中获取数据:
public static DataTable GetDetails(string startDate, string endDate, char isSpam, string Name)
{
string getDetilasQuery = @"sp_getDetails";
SqlParameter[] objSqlParameter = { new SqlParameter("@isDeleted",'n'),
new SqlParameter("@startDate",startDate),
new SqlParameter("@endDate",endDate),
new SqlParameter("@isSpam",isSpam),
new SqlParameter("@Name",Name)
};
return DL.decryptDataSet(SqlHelper.ExecuteDataset(strConnectionString, CommandType.Text, getDetilasQuery, objSqlParameter)).Tables[0];
}
我的存储过程如下:
CREATE PROCEDURE [dbo].[sp_getDetails]
(@isDeleted CHAR(1),
@startDate DATETIME,
@endDate DATETIME,
@isSpam CHAR(1),
@Name VARCHAR(MAX))
As
BEGIN
SELECT
col1, col2....
FROM
tbl_getData
WHERE
added BETWEEN @startDate AND @endDate
AND isDeleted = @isDeleted
END
但每当我尝试使用以下代码和存储过程检索数据时,都会出现错误
存储过程需要未提供的参数@isDeleted!
但是,如代码所示,我使用 SqlParameter[] 传递了参数 @isDeleted。
谁能告诉我是否遗漏了什么,或者代码或存储过程有什么变化?
【问题讨论】:
-
将
CommandType.Text更改为CommandType.StoredProcedure。 -
我不得不说这是最烦人的错误信息之一。我的意思是,从文本中可以清楚地看出 ado.net“知道”这是一个存储过程,问题不在于缺少参数,而是错误的
commandType。它应该是不同的错误消息。 -
@JeroenMostert 感谢您找出我的错误! :-)
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
@ZoharPeled:不——ADO.NET 不知道你的命令文本中有什么。处理“查询”
sp_getDetails的 SQL Server 将其解释为没有EXEC的EXEC sp_getDetails,然后给出缺少参数的错误。您会在 Management Studio 中遇到同样的错误。 (当然,从技术上讲,ADO.NET 可以对 SQL Server 准确返回此错误时进行特殊处理,但在所有情况下都很难做到这一点,只是为了改善用户体验。)这正是CommandType.StoredProcedure的原因一开始就存在。
标签: c# sql sql-server stored-procedures ado.net