当前位置: 首页 > 编程语言 > C#

存储过程中的多值日期参数?在

时间:2023-04-10 20:02:04 C#

存储过程中共享多值日期参数?我正在尝试使用接受日期的多值参数的存储过程。这不在SSRS中,但我正在尝试使用与它相同的方法:ALTERPROCEDUREspSelectPlacementData(@ClientIDSMALLINT,@SourceFileDatesVARCHAR(MAX))ASBEGINSELECT(snip)FROM[APS].[dbo].[Account]AWHEREClientID=@ClientIDANDA.[SourceFileDate]IN(SELECT*FROMdbo.Split(@SourceFileDates))END我将此方法与SSRS报告多值参数上的INT和VARCHAR字段一起使用。这是我用来连接SourceFileDates的代码:stringsourceFileDates="";foreach(job.sourceFiles中的DateTime文件){if(file==job.sourceFiles.Last()){sourceFileDates+="'"+file.ToString("d")+"'";}else{sourceFileDates+="'"+file.ToString("d")+"',";}}selectRunCommand=newSqlCommand("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.Splitfunction我在网上抓了:/******Object:UserDefinedFunction[dbo].[Split]ScriptDate:09/20/201111:16:13******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOALTERFUNCTION[dbo].[Split]/*该函数用于拆分多值参数*/(@ItemListVARCHAR(MAX),@d分隔符CHAR(1))RETURNS@IDTableTABLE(ItemVARCHAR(MAX)collat??edatabase_default)ASBEGINDECLARE@tempItemListVARCHAR(MAX)SET@tempItemList=@ItemListDECLARE@iINTDECLARE@ItemVARCHAR(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)插入@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'为什么不使用表值参数?创建用户定义的表类型DateTimes在SQL上创建类型DateTimes作为表([Value]datetime)然后修改存储过程:ALTERPROCEDUREspSelectPlacementData(@ClientIDSMALLINT,@SourceFileDatesDateTimes只读-必须是只读的)现在你可以想到@SourceFileDates作为只读表变量。指定SqlCommand参数时,Table-Valued参数被指定为SqlDbType.Structured和DataTable或DataRowcollection。因此,您可以像这样填充它:varsourceFileDates=newDataTable();sourceFileDates.Columns.Add("值",typeof(DateTime));foreach(job.sourceFiles中的日期时间文件){sourceFileDates.Rows.Add(文件);}selectRunCommand.Parameters.Add(newSqlParameter{ParameterName="@SourceFileDates",Value=sourceFileDates,SqlDbType=SqlDbType.Structured//确保指定结构化});现在一切都很好并且输入正确......而且您不必进行任何字符串解析或转换。作为旁注,您还可以继续创建字符串和整数类型;您会迷上TVP并在各处使用它们。SSRS有点作弊,因为它控制输入……它与SQL注入攻击无关。使用存储过程,这将更难做到。当我在2005年需要在一个参数中发送多个值时,它对我来说工作得很好,我会像这样将它们作为XML字符串发送:2011-01-232011-02-24然后把Treatitasatableina功能:从@XMLArg.nodes('/dates/date')x(a)中选择xavalue('.','datetime')作为myDate;现在您应该将数据作为表值。(语法可能有点不对劲,不是我脑补出来的)以上是C#学习教程:存储过程中的多值日期参数?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: