【问题标题】:Arraylist of Dates and SQL in VB.NetVB.Net 中日期和 SQL 的数组列表
【发布时间】:2021-01-21 20:45:18
【问题描述】:

我有一个日期数组列表

2020 年 8 月 30 日 2020 年 8 月 27 日 2020 年 9 月 28 日 2020 年 9 月 9 日 2020 年 8 月 31 日 2020 年 8 月 29 日

然后我有一个带有 in 子句的日期查询

   allQuery = "Select pj.ProjectName, tcd.Date, sum(tcd.Executed), sum(tcd.Passed), sum(tcd.Passedbug), sum(tcd.Flaky), sum(tcd.Failed), sum(tcd.Newfailures) "
    allQuery &= "From qastats.dbo.TestCaseDetails tcd inner Join qastats.dbo.Pipelines p on tcd.PipelineID=p.PipelineID inner Join qastats.dbo.Projects pj on p.ProjectID=pj.ProjectID "
    allQuery &= "where pj.ProjectName =@projectname "
    allQuery &= "And tcd.Date in (@dates) group by pj.ProjectName, tcd.Date"

我想把Array列表中的日期列表放到这个格式(和String.Join一样)

8/30/2020,8/27/2020,9/28/2020,9/9/2020,8/31/2020,8/29/2020

所以我可以将它们作为参数的值传入

comm.Parameters.Add("@dates", SqlDbType.DateTime).Value = ListofDates

有没有办法按照我想要的方式或更好的方式来做?

谢谢

【问题讨论】:

  • 您不能将单个参数与单个值一起使用。您要么需要多个参数,要么需要一个 table-valued parameter
  • 对了,你真的有ArrayList吗?如果是这样,不要。 ArrayList 类在 2005 年过时。如果合适,请使用数组,否则使用 List(Of T)
  • 我的坏 jmcilchinney。是的,我使用的是List (Of T)
  • 如果您更喜欢多参数选项,请勾选this。如果您使用的是内联 SQL,这很实用,但如果您使用的是存储过程,则需要表值参数。
  • 表值参数正是我正在寻找的。现在像魅力一样工作!!!

标签: sql-server vb.net date arraylist


【解决方案1】:

按照 cmets 的建议,使用 List 而不是 ArrayList。 对日期使用表值参数。 您需要像这样在数据库中创建表类型(我修改了您的查询,将日期验证稍微移动到连接中,如果您希望在其中取消注释注释行并将连接注释行注释为 @987654321 @):

CREATE TYPE dbo.DatetimeTvp AS TABLE 
(
    value DATETIME NOT NULL
)

然后你就可以使用这个代码了:

Private Sub RunQuery()
    Dim dates As IList(Of DateTime) = New List(Of DateTime)({DateTime.Now, DateTime.UtcNow})
    Dim sb As StringBuilder = New StringBuilder()

    sb.AppendLine(" Select pj.ProjectName, tcd.Date, sum(tcd.Executed), sum(tcd.Passed), sum(tcd.Passedbug), sum(tcd.Flaky), sum(tcd.Failed), sum(tcd.Newfailures) ")
    sb.AppendLine(" From qastats.dbo.TestCaseDetails tcd ")
    sb.AppendLine(" inner Join qastats.dbo.Pipelines p on tcd.PipelineID=p.PipelineID ")
    sb.AppendLine(" inner Join qastats.dbo.Projects pj on p.ProjectID=pj.ProjectID ")
    sb.AppendLine(" inner Join @dates dts on dts.value = tcd.Date ")
    sb.AppendLine(" where pj.ProjectName =@projectname ")
    'sb.AppendLine(" and tcd.Date in (select value from @dates) ")
    sb.AppendLine(" group by pj.ProjectName, tcd.Date ")

    Using cn As SqlConnection = New SqlConnection(ConnectionString)
        Using cmd As SqlCommand = New SqlCommand(sb.ToString(), cn)
            Dim pDates = GetTvp("@dates", dates.Distinct())
            cmd.Parameters.Add(pDates)

            Dim ds As DataSet = New DataSet()
            Dim sqlAd = New SqlDataAdapter(cmd)
            sqlAd.Fill(ds)
            Print(ds)
        End Using
    End Using
End Sub

Private Function GetTvp(ByVal name As String, ByVal dates As IEnumerable(Of DateTime)) As SqlParameter
    Dim dt As DataTable = New DataTable()
    dt.Columns.Add("value", GetType(DateTime))
    For Each d In dates
        dt.Rows.Add(d)
    Next
    Dim p As SqlParameter = New SqlParameter(name, dt)
    p.SqlDbType = SqlDbType.Structured
    p.TypeName = "dbo.DatetimeTvp"
    Return p
End Function

【讨论】:

  • 这个解决方案还有一个好处就是你可以加入tvp
猜你喜欢
  • 2021-01-19
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多