如何从sql动态转移到vb
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从sql动态转移到vb相关的知识,希望对你有一定的参考价值。
我想得到一个动态的结果集,根据我找到的元素。以下是我的查询示例:
declare @til DateTime = dateadd(MINUTE, -0, getdate())
declare @fra datetime = DATEADD(MINUTE, -350, @til)
declare @title nvarchar(max) = 'test title'
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
create table errors (collection_id bigint, nr smallint, position smallint, stamp datetime)
create table t (collection_id bigint, collection_name nvarchar(max), nr smallint, [status] smallint, stamp datetime)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(errors.position)
from t t
left join errors on errors.collection_id = t.collection_id and errors.nr = t.nr
where t.Status = 4 and errors.Stamp > @fra and t.collection_name = ''' + @title + ''' and errors.collection_id is not null
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') , 1, 1, '');
select @cols
set @query = 'declare @til DateTime = dateadd(MINUTE, -0, getdate())
declare @fra datetime = DATEADD(MINUTE, -350, @til)
;with cte as (select t.collection_name, errors.position, count(errors.Tryksag_Nedtagsfejl_Id) antal
from t
left join errors on errors.collection_id = s.collection_id and errors.nr = t.nr
where t.Status = 4 and errors.Stamp > @fra and and t.collection_name = ''' + @title + '''
group by t.collection_name, errors.position)
SELECT collection_name, ' + @cols + ' from
cte
pivot
(
sum(antal)
for position in (' + @cols + ')
) p '
execute(@query)
到目前为止,我已经提出了一个查询,我可以在SSMS上运行,并提供我想要的输出。这将是这样的:
如何在vb.net中为我提供这个结果集?当我只是将它作为一个查询运行它不会给我结果(假设它没有看到执行的结果集)
添加了VB代码
Dim var_til As Short = 0
Dim var_fra As Short = -60
Dim Linie As String = "Red"
Dim tx = "Test title"
Dim Stt2 = "declare @til DateTime = dateadd(MINUTE, " & var_til & ", getdate()) " _
& "declare @fra datetime = DATEADD(MINUTE, " & var_fra & " , @til) " _
& "DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) " _
& "declare @linie as nvarchar(max) = '" & Linie & "' " _
& "declare @title as nvarchar(max) = '" & tx & "' " _
& "select @cols = STUFF((SELECT distinct ',' + QUOTENAME(errors.position) " _
& "from t " _
& "left join errors on errors.collection_id = t.collection_id And errors.nr = t.nr " _
& "where t.Status = 4 And errors.Stamp > @fra And t.collection_name = ''' + @title + ''' and errors.collection_id is not null " _
& "FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') , 1, 1, '') " _
& " " _
& "set @query = ';with cte as (select t.collection_name, errors.position, count(errors.Tryksag_Nedtagsfejl_Id) antal " _
& "from t " _
& "left join errors on errors.collection_id = s.collection_id And errors.nr = t.nr " _
& "where t.Status = 4 And errors.Stamp > @fra And And t.collection_name = ''' + @title + ''' " _
& "group by t.collection_name, errors.position) " _
& "SELECT collection_name, ' + @cols + ' from " _
& "cte " _
& "pivot " _
& "( " _
& "sum(antal) " _
& "for position in (' + @cols + ') " _
& ") p ' " _
& "execute(@query) "
Dim sqlConnection2 As New SqlConnection("Data Source=CONDOR-TI;Initial Catalog=Condor_db;Integrated Security=True")
Dim cmd2 As New SqlCommand
Dim reader2 As SqlDataReader
cmd2.CommandText = Stt2
cmd2.CommandType = CommandType.Text
cmd2.Connection = sqlConnection2
sqlConnection2.Open()
reader2 = cmd2.ExecuteReader()
While reader2.Read
Console.Write(reader2(0))
End While
Console.WriteLine()
sqlConnection2.Close()
reader2.Close()
答案
我认为最好创建一个存储过程来执行这个SQL命令,并使用以下代码从VB.Net执行它:
Dim sqlConnection1 As New SqlConnection("Your Connection String")
Dim cmd As New SqlCommand
Dim reader As SqlDataReader
cmd.CommandText = "StoredProcedureName"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = sqlConnection1
sqlConnection1.Open()
reader = cmd.ExecuteReader()
' Data is accessible through the DataReader object here.
sqlConnection1.Close()
参考
另一答案
您可以分两步运行它。确保在同一连接上运行这两个命令。
在第一个命令中,使用ExecuteNonQuery将cte选择到#temp表中。
在第二个命令中调用ExecuteReader()
Dim var_til As Short = 0
Dim var_fra As Short = -60
Dim Linie As String = "Red"
Dim tx = "Test title"
Dim Stt2 = "declare @til DateTime = dateadd(MINUTE, " & var_til & ", getdate()) " _
& "declare @fra datetime = DATEADD(MINUTE, " & var_fra & " , @til) " _
& "DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) " _
& "declare @linie as nvarchar(max) = '" & Linie & "' " _
& "declare @title as nvarchar(max) = '" & tx & "' " _
& "select @cols = STUFF((SELECT distinct ',' + QUOTENAME(errors.position) " _
& "from t " _
& "left join errors on errors.collection_id = t.collection_id And errors.nr = t.nr " _
& "where t.Status = 4 And errors.Stamp > @fra And t.collection_name = ''' + @title + ''' and errors.collection_id is not null " _
& "FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') , 1, 1, '') " _
& " " _
& "set @query = ';with cte as (select t.collection_name, errors.position, count(errors.Tryksag_Nedtagsfejl_Id) antal " _
& "from t " _
& "left join errors on errors.collection_id = s.collection_id And errors.nr = t.nr " _
& "where t.Status = 4 And errors.Stamp > @fra And And t.collection_name = ''' + @title + ''' " _
& "group by t.collection_name, errors.position) " _
& "SELECT collection_name, ' + @cols + ' INTO #OUT from " _
& "cte " _
& "pivot " _
& "( " _
& "sum(antal) " _
& "for position in (' + @cols + ') " _
& ") p ' " _
& "execute(@query) "
dim stt3 as string = "select * from #OUT"
Dim sqlConnection2 As New SqlConnection("Data Source=CONDOR-TI;Initial Catalog=Condor_db;Integrated Security=True")
Dim cmd2 As New SqlCommand
cmd2.CommandText = Stt2
cmd2.CommandType = CommandType.Text
cmd2.Connection = sqlConnection2
Dim cmd3 As New SqlCommand
Dim reader3 As SqlDataReader
cmd3.CommandText = Stt3
cmd3.CommandType = CommandType.Text
cmd3.Connection = sqlConnection2
sqlConnection2.Open()
cmd2.ExecuteNonQuery()
reader3 = cmd3.ExecuteReader()
While reader3.Read
Console.Write(reader3(0))
End While
Console.WriteLine()
sqlConnection2.Close()
reader3.Close()
以上是关于如何从sql动态转移到vb的主要内容,如果未能解决你的问题,请参考以下文章
如何将图像从一个图片框传输到另一个图片框? VB.NET 和 SQL
Asp.Net, VB, SQL Server Reporting Services..从目录中动态生成的报告要在单击时在报告查看器上查看?