将参数的日期类型转换为linq查询中存储过程的varchar

时间:2015-09-16 04:28:13

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

我已创建此存储过程,以按typecategorycountrysubsidarydate过滤产品。

 CREATE PROCEDURE [dbo].[FindIncomplete_Products]
     @type nvarchar(250),
     @category nvarchar(250),
     @country nvarchar(250),
     @subsidary nvarchar(250),
     @date datetime
AS
Begin  
    select  [dbo].[AB_Product].[ProductID],
            [dbo].[AB_Product].[ProductTitleEn],
            [dbo].[AB_Product].[ProductTitleAr], 
            [dbo].[AB_Product].[Status],
            [dbo].[AB_ProductType].[ProductTypeNameEn],
            [dbo].[AB_ProductType].[ProductTypeNameAr], 
            [dbo].[AB_ProductTypeCategory].[ProductCategoryNameEn],
            [dbo].[AB_ProductTypeCategory].[ProductCategoryNameAr],
            [dbo].[AB_Subsidary].[SubsidaryNameEn],
            [dbo].[AB_Subsidary].[SubsidaryNameAr],
            [dbo].[AB_Subsidary].[Country]
    from 
        [dbo].[AB_Product]
    inner join 
        [dbo].[AB_ProductType] on [dbo].[AB_ProductType].[ProductTypeID] = [dbo].[AB_Product].[ProductTypeID]
    inner join 
        [dbo].[AB_ProductTypeCategory] on [dbo].[AB_ProductTypeCategory].[ProductCategoryID] = [dbo].[AB_Product].[ProductCategoryID]
    inner join 
        [dbo].[AB_Subsidary] on [dbo].[AB_Subsidary].[SubsidaryID] = [dbo].[AB_Product].[Subsidary_ID]
    WHERE 
       (@type IS NULL OR [dbo].[AB_Product].[ProductTypeID]  LIKE '%' +  @type + '%')
       AND (@category IS NULL OR [dbo].[AB_Product].[ProductCategoryID] LIKE '%' +  @category + '%')
       AND (@country IS NULL OR [dbo].[AB_Subsidary].[Country] LIKE '%' +  @country + '%')
       AND (@subsidary IS NULL OR [dbo].[AB_Product].[Subsidary_ID] LIKE '%' +  @subsidary + '%')
       AND (@date IS NULL OR [dbo].[AB_Product].[CreatedDate] LIKE '%' +  @date + '%')
End

我在C#控制器类中通过LINQ查询传递参数值。这就是linq查询

public ActionResult Program_Search(string type, string category, string country, string subsidary, DateTime? date)
{
     var incomplete_product_result = db.Database.SqlQuery<ProductCollection>("FindIncomplete_Products  @type = {0}, @category = {1}, @country = {2}, @subsidary = {3}, @date = {4}", type, category, country, subsidary, date).ToList();

    return View(incomplete_product_result);
}

尝试通过绑定URL来传递参数,例如关注

http://localhost:49669/Home/Program_Search?type=002&category=null&subsidary=null&country=null&date=12/12/1889

我收到了以下错误

  

从字符转换日期和/或时间时转换失败   字符串。

2 个答案:

答案 0 :(得分:1)

修复您的&#34;数据未进入视图&#34;问题,检查当前未绑定到任何模型对象的incomplete_product_result的模型。

答案 1 :(得分:1)

打开SSMS(SQL Server Management Studio)并键入

$.ajax({
    type: 'GET',        
    url: '//steamcommunity.com/id/STEAMIDHERE/inventory/json/730/2',

    async: false,
    jsonp: "callback",
    jsonpCallback: 'someCallBackFunction',
    contentType: "application/json",
    dataType: 'jsonp',

    success: function (data) {
        console.log(data);
        //do your stuff
    },
    error: function (e) {
        console.log(e);            
    }
});

并按F5键,您将收到该错误,与Web前端没有任何关系

这个问题就是这个问题:

EXEC FindIncomplete_Products NULL,NULL,NULL,NULL,'2015-01-01' 

您正在将字符串连接到某个日期,因此它会尝试将字符串隐式转换为日期,并且肯定无法将'%' + @date + '%' 转换为日期。

要解决此问题,请更改此行

%

到此

AND (@date IS NULL OR [dbo].[AB_Product].[CreatedDate] LIKE '%' +  @date + '%')
存储过程中的

第一行实际上没有逻辑意义。你不能AND (@date IS NULL OR [dbo].[AB_Product].[CreatedDate] = @date) 对抗约会。

这假设网络代码中没有其他问题。

如果您不知道如何使用SSMS,您是如何创建存储过程的?

(这实际上都是基于@Bhavek的评论 - 他先注意到了!)