2016-07-21 3 views
0

나는 액세스 DB를 쿼리하는 응용 프로그램을 빌드하는 데 VS를 사용하고 있습니다. 양식 탭 중 하나에는 12 개의 버튼이 있으며 각 버튼 근처에는 눌린 시간 수가 표시된 레이블이 있습니다. 폼이로드되면 DB에 쿼리하여 해당 날짜에 사용자가 누른 횟수를 표시합니다.vb.net 여러 테이블 한 테이블

Public Class Form1 
Dim connString As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=\\networkdrive\DB_Reg_V01_10.accdb" 
Dim da1, da2, da3, da4, da5, da6, da7, da8, da9, da10, da11, da12 As OleDbDataAdapter 
Dim ds1, ds2, ds3, ds4, ds5, ds6, ds7, ds8, ds9, ds10, ds11, ds12 As DataSet 
Dim tables As DataTableCollection 
Dim source1 As New BindingSource 
Dim provider, dataFile As String 
Dim cmd As OleDbCommand = Nothing 
Dim myConnection As OleDbConnection = New OleDbConnection 

Private Sub Form1_Load(sender As System.Object, e As EventArgs) Handles MyBase.Load 

ds1 = New DataSet 
tables = ds1.Tables 
da1 = New OleDbDataAdapter("Select Count(*) from TB_Atividades Where ([User] = '" & boxUser.Text & "') AND (Data = DATE()) AND (Prod = 'Cat23')", myConnection) 
da1.Fill(ds1, "ID") 
Dim view1 As New DataView(tables(0)) 
DataGridView1.DataSource = view1 
lblCount1.Text = DataGridView1.CurrentCell.Value.ToString() 

ds2 = New DataSet 
tables = ds2.Tables 
da2 = New OleDbDataAdapter("Select Count(*) from TB_Atividades Where ([User] = '" & boxUser.Text & "') AND (Data = DATE()) AND (Prod = 'Cat4410')", myConnection) 
da2.Fill(ds2, "ID") 
Dim view1 As New DataView(tables(0)) 
DataGridView1.DataSource = view2 
lblCount2.Text = DataGridView1.CurrentCell.Value.ToString() 

/.../ 

ds12 = New DataSet 
tables = ds12.Tables 
da12 = New OleDbDataAdapter("Select Count(*) from TB_Atividades Where ([User] = '" & boxUser.Text & "') AND (Data = DATE()) AND (Prod = 'Cat101')", myConnection) 
da12.Fill(ds12, "ID") 
Dim view12 As New DataView(tables(0)) 
DataGridView1.DataSource = view12 
lblCount12.Text = DataGridView1.CurrentCell.Value.ToString() 

/.../ 

코드가 작동하지만 시작하는 데 시간이 걸립니다. 나는 무엇을 더 효율적으로 만들지 만 효율적입니다.

DB에 대한 호출 횟수를 줄이는 방법이 있습니까?

미리 알아 두십시오.

+0

필요할 때 데이터를로드하십시오. 또한 DataTable 당 1 개의 DataSet이 필요하지 않습니다. 그 중 하나는 이름을 가질 수있는 여러 테이블을 저장할 수 있다는 점입니다. 당신은 COUNT 쿼리를 위해 DataTable이 필요하지 않습니다. 단지'ExecuteScalar'와 함께 명령을 사용하고 그 결과를 변수에 저장하십시오. – Plutonix

답변

1

기능을 수행하는 방법을 알아야하고 parametrize your query이 필요합니다. 짧은 시간 동안 연결을 열어야합니다. 카운트가 필요한 경우 전체 데이터 세트 대신 ExecuteScalar에 전화하면됩니다.

Function GetCount(ByVal user As String, ByVal product As String) As Integer 

    Dim result As Integer 
    Dim command As New OleDbCommand("Select Count(*) from TB_Atividades Where ([User] = ?) AND (Data = DATE()) AND (Prod = ?)", connection) 

    command.Parameters.Add(user) 
    command.Parameters.Add(product) 

    myConnection.Open() 
    result = command.ExecuteScalar() 
    myConnection.Close() 

    return result 
End Function 


lblCount1.Text = GetCount(boxUser.Text, "Cat23") 
lblCount2.Text = GetCount(boxUser.Text, "Cat4410") 

테스트 할 수 없으므로 복사/붙여 넣기 만하지 마십시오. 올바른 조치를 취할 수있는 안내가되기를 바랍니다.

모든 범주를 쿼리해야하는 경우 모든 범주 목록을 반환하고 루프를 반복하면됩니다. 최소한의 시간 만 데이터베이스에 쿼리하는 것이 좋습니다.

SELECT Prod, count(*) FROM ... GROUP BY Prod 
+0

Tks lotus. 나는 이것이 코드가 갈 수있는 최선의 방법이라고 생각한다. 필요한 수정 작업을했지만 결과가 표시되지 않습니다. 계속 지켜봐. –

0

Form_Load 이벤트에서 모든 논리를 사용하려면 작업을 완료하는 데 약간의 시간이 걸리고 양식로드가 지연됩니다.

응용 프로그램에 스레딩 개념을 구현해야하는 것을 피하기 위해. 새 스레드를 만들고 그 안에 논리를 작성해야합니다. Form_Load 이벤트에서 스레드를 시작하고 스레드 실행이 끝날 때까지 폼에 로딩 심볼을 표시하십시오.

데이터베이스를 자주 쿼리하는 대신 데이터베이스에서 모든 레코드를 가져 와서 DataTable에 저장할 수 있습니다. DataTable.select ("쿼리")를 사용하여 요구 사항에 따라 레코드를 필터링하십시오.