【问题标题】:Using stored procedures to retrieve data使用存储过程检索数据
【发布时间】: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 将其解释为没有EXECEXEC sp_getDetails,然后给出缺少参数的错误。您会在 Management Studio 中遇到同样的错误。 (当然,从技术上讲,ADO.NET 可以对 SQL Server 准确返回此错误时进行特殊处理,但在所有情况下都很难做到这一点,只是为了改善用户体验。)这正是CommandType.StoredProcedure 的原因一开始就存在。

标签: c# sql sql-server stored-procedures ado.net


【解决方案1】:

正如@Jeroen 所建议的,将 CommandType.Text 更改为 CommandType.StoredProcedure 就可以了。

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多