c# – 存储过程中的多值日期参数?

c# – 存储过程中的多值日期参数?,第1张

概述我正在尝试使用存储过程来接受日期的多值参数.这不是在SSRS中,但我试图使用与它相同的方法: ALTER PROCEDURE spSelectPlacementData( @ClientID SMALLINT, @SourceFileDates VARCHAR(MAX))ASBEGIN SELECT (snip) FROM [APS 我正在尝试使用存储过程来接受日期的多值参数.这不是在SSRS中,但我试图使用与它相同的方法:

ALTER PROCEDURE spSelectPlacementData(    @ClIEntID           SMALliNT,@SourcefileDates    VARCHAR(MAX))ASBEGIN    SELECT (snip)    FROM [APS].[dbo].[Account] A    WHERE ClIEntID = @ClIEntID    AND A.[SourcefileDate] IN (SELECT * FROM dbo.Split(@SourcefileDates))END

我在SSRS报告多值参数上使用此方法和INT和VARCHAR字段.

这是我用来连接SourcefileDates的代码:

string sourcefileDates = "";    foreach (DateTime file in job.sourcefiles)    {        if (file == job.sourcefiles.Last())        {            sourcefileDates += "'" + file.ToString("d") + "'";        }        else        {            sourcefileDates += "'" + file.ToString("d") + "',";        }    }    selectruncommand = new sqlCommand("spSelectPlacementData",sqlConnection);    selectruncommand.CommandType = CommandType.StoredProcedure;    selectruncommand.Parameters.Add("@ClIEntID",sqlDbType.Smallint);    selectruncommand.Parameters["@ClIEntID"].Value = job.clIEntID;    selectruncommand.Parameters.Add("@SourcefileDates",sqlDbType.VarChar);    selectruncommand.Parameters["@SourcefileDates"].Value = sourcefileDates;

使用这个dbo.Split功能我在网上抓了:

/****** Object:  UserdefinedFunction [dbo].[Split]    Script Date: 09/20/2011 11:16:13 ******/SET ANSI_NulLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION [dbo].[Split]/* This function is used to split up multi-value parameters */(@ItemList VARCHAR(MAX),@delimiter CHAR(1))RETURNS @IDtable table (Item VARCHAR(MAX) collate database_default )ASBEGINDECLARE @tempItemList VARCHAR(MAX)SET @tempItemList = @ItemListDECLARE @i INTDECLARE @Item VARCHAR(MAX)SET @tempItemList = REPLACE (@tempItemList,@delimiter + ' ',@delimiter)SET @i = CHARINDEX(@delimiter,@tempItemList)WHILE (LEN(@tempItemList) > 0)BEGINIF @i = 0SET @Item = @tempItemListELSESET @Item = left(@tempItemList,@i - 1)INSERT INTO @IDtable(Item) VALUES(@Item)IF @i = 0SET @tempItemList = ''ELSESET @tempItemList = RIGHT(@tempItemList,LEN(@tempItemList) - @i)SET @i = CHARINDEX(@delimiter,@tempItemList)ENDRETURNEND

我想我不完全清楚我如何格式化参数,SSRS如何对类似参数这样做(这是我从代码中尝试过的唯一一个),以及Date数据类型如何影响所需格式.我收到了“从字符串转换日期和/或时间时转换失败”.选择多个值时出错.

编辑:根据要求,foreach循环输出的示例:

‘9/9/2011’,‘8/19/2011’,‘8/12/2011’

解决方法 为什么不使用 Table-Valued parameter?

在sql上创建用户定义的表类型DateTimes

create type DateTimes as table(    [Value] datetime)

然后修改您的存储过程:

ALTER PROCEDURE spSelectPlacementData(    @ClIEntID           SMALliNT,@SourcefileDates    DateTimes Readonly -- must be Readonly)

现在,您可以将@SourcefileDates视为只读表变量.

指定sqlCommand参数时,table-Valued参数指定为SqlDbType.Structured并作为DataTableDataRowcollection传递.因此,您可以像这样填充它:

var sourcefileDates = new Datatable();sourcefileDates.Columns.Add("Value",typeof(DateTime));foreach (DateTime file in job.sourcefiles){    sourcefileDates.Rows.Add(file);}selectruncommand.Parameters.Add(new sqlParameter {    Parametername = "@SourcefileDates",Value = sourcefileDates,sqlDbType = sqlDbType.Structured // make sure you specify structured});

现在一切都很好并且输入正确…而且您不必进行任何字符串解析或转换.

作为旁注,你也可以继续创建字符串和整数类型;你会迷上TVP并在整个地方使用它们.

总结

以上是内存溢出为你收集整理的c# – 存储过程中的多值日期参数?全部内容,希望文章能够帮你解决c# – 存储过程中的多值日期参数?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223212.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存