[asp.net-mvc]转换参数的日期类型为 varchar,存储过程在 linq 查询中的

发布时间: 2017/3/25 11:00:14
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我已经创建了筛选器产品通过此存储的过程 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

我得到下列错误

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

解决方法 1:

打开 SSMS (SQL 服务器管理studio) 和类型

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

并按 f5 键,你会得到这一错误,无事可做了 web 前端

这个问题是此表达式︰

'%' +  @date + '%'

你串联字符串到日期,所以它试图隐式强制转换到一个日期的字符串,它当然不能转换 % 到目前为止。

若要修复它,更改这条线

AND (@date IS NULL OR [dbo].[AB_Product].[CreatedDate] LIKE '%' +  @date + '%')

对此

AND (@date IS NULL OR [dbo].[AB_Product].[CreatedDate] = @date)

在您的存储过程

第一行实际上没有逻辑的道理。你不能 LIKE 反对日期。

这假定 web 代码中有没有进一步的问题。

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

(这其实是基于 @Bhavek 的评论 — — 他第一次注意到它 !)

赞助商