2017-01-01 5 views
0

현재 내 프로젝트에서 SQL 쿼리의 결과로 DataGridView 개체를 채우는 다음 코드가 있습니다. 오히려 DataGridView를 채우기보다이 코드를 사용하여 VB.NET에서 데이터 집합을 만드는 방법은 무엇입니까?

MaxRows = ds.Tables("Dataset_Users").Rows.Count 

:

Sub PerformQuery(ByVal SQLText As String) 
    Dim DbConnection As New OleDb.OleDbConnection(createConnectionString) 

    Dim SQLQuery As String = SQLText 

    Dim Adapter As New OleDb.OleDbDataAdapter(SQLQuery, DbConnection) 

    Try 
     Using Table As New DataTable 
      Adapter.Fill(Table) 
      Table.Locale = Globalization.CultureInfo.InvariantCulture 
      DbConnection.Close() 
      DataGridView1.DataSource = Table 
     End Using 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

는 다른 곳에서 내 프로젝트에서 나는
Dim ds As New DataSet 

코드

를 사용하여 DataSet 개체를 만들 수 있습니다 그리고 다음과 같은 코드를 사용하여 데이터를 추출 PerformQuery 코드를 사용하여 데이터 집합을 만드는 방법은 무엇입니까?

도움을 주셔서 감사합니다.

+0

작성 및 데이터 테이블 대신 데이터 집합을 입력합니다. 행 수를 얻으려면 DataSet이 필요 없습니다. 대부분 테이블 컬렉션입니다. 다른 곳에서 사용하고 싶다면 폼 레벨의 객체를 만들고 싶을 것입니다. 그러나 그것의 설정을하지 않았다면 테이블과 함께 할 수 있습니다 – Plutonix

+0

'MaxRows = ds.Tables ("Dataset_Users"). Rows.Count' DataSet에는 데이터가 저장되지 않습니다. 그것은 하나 이상의 테이블을 보유하고 있습니다 : 특정 테이블에서 작동하도록 컬렉션에서 코드가 어떻게 작동하는지 확인하십시오. 'MaxRows = Adapter.Fill (Table) ' – Plutonix

+0

'PerformQuery()'메소드는 SQL Injection 공격에 취약한 코드를 작성해야하기 때문에 심하게 결함이 있습니다. 메서드에 추가 매개 변수를 추가하여 쿼리 텍스트와 쿼리 데이터를 받아 들인 다음 메서드를 업데이트하여 해당 데이터를 사용하여 매개 변수가있는 쿼리를 만들면됩니다. –

답변

0

난 당신이 생각하는 후 다음

Try 
    Dim ds As New DataSet 
    Using Table As New DataTable 
     Adapter.Fill(Table) 
     Table.Locale = Globalization.CultureInfo.InvariantCulture 
     DbConnection.Close() 
     DataGridView1.DataSource = Table 
     ds.Table.Add(Table) 
    End Using 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 

아니면 데이터 세트의 행 수 후에이었다 당신의 예에서와 같이 당신은 예를 들어, DataTable을 사용하여 동일한 작업을 수행 할 수

:

Try 
    Dim MaxRows As Integer 
    Using Table As New DataTable 
     Adapter.Fill(Table) 
     Table.Locale = Globalization.CultureInfo.InvariantCulture 
     DbConnection.Close() 
     DataGridView1.DataSource = Table 

     '' Getting the number of rows in the DataTable 
     MaxRows = Table.Rows.Count 
    End Using 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 
0

더 기능적인 스타일로 생각하십시오. 표를 그리드로 설정하는 대신 반환하십시오. 나는 또한 오류 처리 및 로케일 코드를 제거

Function PerformQuery(ByVal SQLText As String, ByVal ParamArray Parameters() As OleDbParameter) As DataTable 
    Dim result As New DataTable() 

    Using cn As New OleDb.OleDbConnection(createConnectionString), _ 
      cmd As New OleDb.OleDbCommand(SQLText, cn), _ 
      Adapter As New OleDb.OleDbDataAdapter(cmd, cn) 

     If Parameters IsNot Nothing AndAlso Parameters.Length > 0 Then 
      cmd.Parameters.AddRange(Parameters) 
     End If 
     Adapter.Fill(result) 
    End Using 

    Return Result 
End Function 

참고 : 우리가 여기있는 동안, 당신은 SQL 주입 공격에 무방비에게 떠날 것을 더 이상 쿼리를 작성하지 않아도의 메소드를 업데이트 할 수 있습니다. 여전히 그런 작업을해야하지만 메서드에서 사용자 인터페이스와 직접 상호 작용하는 대신 데이터 테이블을 반환하려는 경우 코드를 효과적으로 낮은 수준의 추상화 수준으로 옮겼습니다. 그렇게하면 더 낮은 수준의 오류 처리를 더 이상 처리하지 않으려 고합니다. 대신 예외를 처리하여 사용자 인터페이스에 가깝게 처리 할 수 ​​있도록하십시오.

이제 다음과 같이 업데이트 된 메소드를 호출

Dim sql As String = "SELECT * FROM Customers WHERE CustomerID = ?" 
Dim CustID As New OleDb.OleDbParameter("CustomerId", OleDbType.Integer) 
CustID.Value = 123456 

Try 
    DataGridView1.DataSource = PerformQuery(sql, CustID) 
Catch Ex As Excpetion 
    MsgBox(Ex.Message) 
End Try