2017-12-18 173 views
6

Tôi muốn lấy một bộ kết quả động theo các yếu tố mà tôi tìm thấy. Đây là mẫu truy vấn của tôi:Cách lấy trục động từ sql đến 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) 

Cho đến nay tôi đã thực hiện truy vấn tôi có thể chạy trên SSMS và cung cấp cho sản lượng mong muốn. Đó sẽ là như thế này:

enter image description here

Làm thế nào tôi có thể làm resultset này có sẵn cho tôi trong vb.net? Khi tôi chỉ cần chạy nó tất cả như một truy vấn nó không cho tôi kết quả (giả sử nó không thấy resultset từ thực hiện)

Added VB Mã

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() 
+2

gì đang nhìn VB của bạn như thế nào? – SMM

+0

[mcve] vui lòng: bảng và nội dung ... – Blag

+0

Làm thế nào để bạn chạy truy vấn này trong mã VB của bạn? – FLICKER

Trả lời

4

tôi nghĩ rằng nó là tốt hơn để tạo ra một lưu trữ thủ tục để thực hiện lệnh SQL này, và thực hiện nó từ VB.Net sử dụng đoạn mã sau:

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() 

Reference

3

Bạn có thể chạy theo hai bước. Đảm bảo bạn chạy cả hai lệnh trên cùng một kết nối.

Trong lệnh đầu tiên, cte được chọn vào bảng #temp bằng ExecuteNonQuery.

Trong giây ExecuteReader gọi lệnh()

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() 
+0

Nó không phải là một ý tưởng tốt để gửi lệnh sql trong mã ứng dụng, tôi nghĩ rằng nó là tốt hơn để sử dụng thủ tục lưu trữ hoặc bảng chức năng có giá trị – Yahfoufi

+0

Tôi đồng ý. Đặc biệt là trong một ngôn ngữ định hướng dòng như VB. Ít nhất trong C# tất cả các SQL này có thể được trong một khối duy nhất của chuỗi. Tôi tránh nhúng SQL như thế này. Tôi cho rằng phải có những lý do khác cho cách tiếp cận này. – suresubs

Các vấn đề liên quan