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

本文关键字:日期 类型转换 varchar 查询 linq 存储过程 参数 | 更新日期: 2023-09-27 18:13:06

我创建了这个存储过程来按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

我得到以下错误

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

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

打开SSMS (SQL Server Management 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的评论-他首先注意到它!)

要修复您的"数据未进入视图"问题,请检查incomplete_product_result模型,该模型目前未绑定到任何模型对象。

相关文章: