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循环输出的示例:
解决方法 为什么不使用 Table-Valued parameter?‘9/9/2011’,‘8/19/2011’,‘8/12/2011’
在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
并作为DataTable
或DataRowcollection
传递.因此,您可以像这样填充它:
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# – 存储过程中的多值日期参数?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)