简体   繁体   中英

adding results of query against datatable to a column in another datatable in visual basic

Problem: I have populated a datatable using a query on a sql server database. The query is:

Select ID, startDate, codeID, Param, 
(select top 1 startDate from myTable 
where ID='" & ID & "' and Param = mt.param and codeID = 82 and startDate >= '" & startDate & "' and startDate >=mt.startDate 
ORDER BY startDate)endTime, 
from myTable mt where ID = '" & ID & "' 
AND (startDate between '" & startDate & "' AND '" & endDate & "' AND (codeID = 81))

I want a new column called duration that will be the difference between endTime and startDate in milliseconds. I can't just add another subquery to the above query since the endTime column didn't exist until the subquery was ran.

So, is there a way to maybe run the first query to populate the datatable, then run a query like:

Select DateDiff(ms,endTime,startDate)

On its own and add its results to a new column in my datatable?

You can always nest that in another query:

select *, datediff(ms, startDate, endTime)
from ( 
    <your existing query here>
) t

And while I'm here, it seems you need a lesson in parameterized queries:

Dim result As New DataTable
Dim Sql As String = _
      "SELECT *, datediff(ms, startDate, endTime) FROM (" & _
      "SELECT ID, startDate, codeID, Param, " & _
          "(select top 1 startDate from myTable " & _
           "where ID= @ID and Param = mt.param and codeID = 82 and startDate >= @startDate and startDate >=mt.startDate " & _
           "ORDER BY startDate) endTime " & _ 
      " FROM myTable mt " & _
      " WHERE ID = @ID AND startDate between @startDate AND @endDate AND codeID = 81" & _
      ") t"

Using cn As New SqlConnection("connection string"), _
      cmd As New SqlCommand(sql, cn)

    cmd.Parameters.Add("@ID", SqlDbType.VarChar, 10).Value = ID
    cmd.Parameters.Add("@startDate", SqlDbType.DateTime).Value = Convert.ToDateTime(startDate)
    cmd.Parameters.Add("@endDate", SqlDbType.DateTime).Value = Convert.ToDateTime(endDate)

    cn.Open()
    Using rdr = cmd.ExecuteReader()
        result.Load(rdr)
        rdr.Close()
    End Using
End Using

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM