【问题标题】:C# MVC Datatype to pass for stored procedure output parameter为存储过程输出参数传递的 C# MVC 数据类型
【发布时间】:2014-09-04 13:45:37
【问题描述】:

我正在尝试从 C# MVC 控制器调用 SQL 服务器存储过程。存储过程的参数如下:

ALTER procedure [dbo].[spVehicleSearch360]
    @strLocale          nvarchar(10),
    @xmlSearchCriteria  xml,
    @strSortBy          nvarchar(30),
    @strSortDir         nvarchar(5),
    @uidSessionId       uniqueidentifier,
    @iPage                int = 1,
    @iPageSize          int = 10,
    @iCount               int output,
    @iTotalCount        int output,
    @bShowResults       bit = 1,
    @xmlResults         xml = null output,
    @dtLastItemModified datetime = null output,
    @uidVehicleInList uniqueidentifier = null
as
begin 
.........
.........
.........

当我从我的控制器调用它时:

var search_results = db.spVehicleSearch(strLocale, xmlSearchCriteria, strSortBy, strSortDir, uidSessionId, iPage, iPageSize, iCount, iTotalCount, bShowResults, xmlResults, dtLastItemModified, uidVehicleInList);

存储过程的输出参数(参数 8、9、11、12)出现以下错误

Arugment [n]:无法从 [int/string/system.DateTime] 转换为 'System.Data.Objects.ObjectParameter'

我应该为这些参数传递什么?

(抱歉,如果这是一个非常基本的问题,我对 .net 很陌生)

谢谢

【问题讨论】:

  • 我假设您使用的是实体框架?你的模型中db.spVehicleSearch() 的签名是什么?
  • 您应该传入与您期望的输出具有相同数据类型的变量。
  • @SvenGrosen 给你。它为麻烦的参数指定 ObjectParameter 但我不确定如何在传递它们之前声明它们: public virtual int spVehicleSearch(string strLocale, string xmlSearchCriteria, string strSortBy, string strSortDir, Nullable uidSessionId, Nullable iPage, Nullable iPageSize, ObjectParameter iCount, ObjectParameter iTotalCount, Nullable bShowResults, ObjectParameter xmlResults, ObjectParameter dtLastItemModified, Nullable uidVehicleInList)

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


【解决方案1】:

解决此问题的最简单方法是仅将声明为 ObjectParameter 的参数包装在该类的实例中,如下所示:

var iCountParam = new ObjectParameter("iCount", typeof(int));
var iTotalCountParam = new ObjectParameter("iTotalCount", typeof(int));
var xmlResultsParam = new ObjectParameter("xmlResults", typeof(string));
var dtLastItemModifiedParam = new ObjectParameter("dtLastItemModified", typeof(DateTime));

var search_results = db.spVehicleSearch(strLocale, xmlSearchCriteria, strSortBy, strSortDir, uidSessionId, iPage, iPageSize, iCountParam, iTotalCountParam, bShowResults, xmlResultsParam, dtLastItemModifiedParam, uidVehicleInList);
//using your previously declared variables...
iCount = (int)iCountParam.Value;
iTotalCount = (int)iTotalCountParam.Value;
//since these are nullable params, gotta check before casting
//you can obviously use whatever you want for the value if it is indeed null
xmlResults = Convert.IsDBNull(xmlResultsParam.Value) ? null : (string)xmlResultsParam.Value;
dtLastItemModified = Convert.IsDBNull(dtLastItemModifiedParam.Value) ? DateTime.MinValue : (DateTime)dtLastItemModifiedParam.Value;

Entity Framework 很难以这种方式处理输出参数,并将它们包装在通用 ObjectParameter 类型中以使事情变得更容易,尽管这对您来说意味着更多样板代码。

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 2018-01-01
    • 2014-01-30
    • 1970-01-01
    • 2015-01-02
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多