2014-12-01 14 views
8

Xin chào Tôi đã gặp một vấn đề trong khi tạo dự án trường học của tôi.Lấy các giá trị lớp dựa trên khóa

Một số mô tả:

Liệt kê - đối tượng của nó và được nối thêm bằng truy vấn sql và sau đó trở thành danh sách liệt kê. Khách hàng - Khách hàng: id, tên, họ

Listy sql đổ dụ

id+ number     +letters+forwho+bywho+created   +prority+type 
7 900000170300000935295877 0  3  202 2013-11-27 16:37:55 0  1 

Vấn đề

xem DataGrid của tôi trông giống hệt theo cùng một cách như là kết quả mysql, những gì tôi muốn nhận được là một màn hình hiển thị thân thiện hơn vì vậy nếu tôi có byhwo 202 (một id khách hàng của nó) tôi muốn được hiển thị trong xem datagrid Ví dụ Tên Họ Tên. Nó phải được thực hiện với mã này bằng cách nào đó. Ngoài ra một tính năng tốt đẹp sẽ có khả năng xóa và cập nhật một Class Client bằng cách nào đó.

Lớp Lõi

Class Core 
Dim gridDataList As New BindingList(Of Listy) 
    Dim cmd As New MySqlCommand 
    Dim da As New MySqlDataAdapter 
    Dim con As MySqlConnection = jokenconn() 
    Public list As New List(Of Customers) 
    Public Function jokenconn() As MySqlConnection 
     Return New MySqlConnection(.......) 
    End Function 

    Public Sub init_customers() 
     ' Create a list of strings. 
     Dim sql As String 
     Dim myReader As MySqlDataReader 

     con.Open() 
     sql = "select * from customers" 
     'bind the connection and query 
     With cmd 
      .Connection = con 
      .CommandText = sql 
     End With 
     myReader = cmd.ExecuteReader() 
     While myReader.Read() 
      list.Add(New Customers(myReader.GetInt64(0), myReader.GetString(1), myReader.GetString(2))) 
     End While 
     con.Close() 
    End Sub 


    Public Function display_single_name() 
     Return 0 
     'Dim pinfo As propertyinfo = GetType(String).GetProperty("") 
     'here i want to return the name and surname of client based on a number/id 
    End Function 
End Class 

Lớp Khách hàng

Class Customers 

    Public Sub New(ByVal id As Integer, ByVal name As String, ByVal surname As String) 
     Me.ID = id 
     Me.Imie = name 
     Me.Nazwisko = surname 

    End Sub 
#Region "Get/Set" 
    Public Property ID() As Integer 
     Get 
      Return Me._id 
     End Get 
     Set(ByVal value As Integer) 
      Me._id = value 
     End Set 
    End Property 
    Public Property Imie() As String 
     Get 
      Return Me._imie 
     End Get 
     Set(ByVal value As String) 
      Me._imie = value 
     End Set 
    End Property 
    Public Property Nazwisko() As String 
     Get 
      Return Me._nazwisko 
     End Get 
     Set(ByVal value As String) 
      Me._nazwisko = value 
     End Set 
    End Property 

#End Region 
    Private _id As Integer 
    Private _imie As String 
    Private _nazwisko As String 

End Class 

Lớp Listy

Class Listy 

    ' Private _comments As String 
    ' Private _firstName As String 
    ' Private _secondName As String 

    Public Sub New(ByVal id As Integer, ByVal listnumb As String, ByVal list_count As Integer, ByVal by_who As Integer, ByVal for_who As Integer, ByVal created As Date, ByVal prority As Integer, ByVal type As Integer) 
     Me.ID = id 
     Me.Lista = listnumb 
     Me.Listów = list_count 
     Me.Wystawione_przez = by_who 
     Me.Wystawione_na = for_who 
     Me.Priorytet = prority 
     Me.Rodzaj_Listy = type 
     Me.Utworzono = created 

    End Sub 
#Region "Get/Set" 
    Public Property ID() As Integer 
     Get 
      Return Me._id 
     End Get 
     Set(ByVal value As Integer) 
      Me._id = value 
     End Set 
    End Property 
    Public Property Lista() As String 
     Get 
      Return Me._list_Number 
     End Get 
     Set(ByVal value As String) 
      Me._list_Number = value 
     End Set 
    End Property 
    Public Property Listów() As Integer 
     Get 
      Return Me._Lst_Count 
     End Get 
     Set(ByVal value As Integer) 
      Me._Lst_Count = value 
     End Set 
    End Property 
    Public Property Wystawione_przez() As Integer 
     Get 
      Return Me._bywho 
     End Get 
     Set(ByVal value As Integer) 
      Me._bywho = value 
     End Set 
    End Property 
    Public Property Wystawione_na() As Integer 
     Get 
      Return Me._forwho 
     End Get 
     Set(ByVal value As Integer) 
      Me._forwho = value 
     End Set 
    End Property 
    Public Property Priorytet() As Integer 
     Get 
      Return Me._prority 
     End Get 
     Set(ByVal value As Integer) 
      Me._prority = value 
     End Set 
    End Property 
    Public Property Rodzaj_Listy() As Integer 
     Get 
      Return Me._type 
     End Get 
     Set(ByVal value As Integer) 
      Me._type = value 
     End Set 
    End Property 
    Public Property Utworzono() As Date 
     Get 
      Return Me._date 
     End Get 
     Set(ByVal value As Date) 
      Me._date = value 
     End Set 
    End Property 
#End Region 
    Private _id As Integer 
    Private _Lst_Count As Integer 
    Private _bywho As Integer 
    Private _forwho As Integer 
    Private _prority As Integer 
    Private _type As Integer 
    Private _date As Date 
    Private _list_Number As String 
End Class 
+1

Câu hỏi của bạn hiện đang kết hợp trong rất nhiều từ buzz kỹ thuật và hầu như không cung cấp thông tin hữu ích về sự cố. Đừng cố giải thích mã, hoặc cách tiếp cận bạn đã thử. Cố gắng giải thích vấn đề thực tế bạn đang cố gắng giải quyết, bằng tiếng Anh. Cố gắng càng cụ thể càng tốt, sử dụng 20 từ hoặc hơn. Sau đó bạn có thể xây dựng thêm về nó. – Neolisk

+0

@Neolisk Ok hãy để tôi rút ngắn điều này: Lớp Khách hàng (get/set property), tôi có một hàm để nối kết quả sql vào lớp khách hàng (list.add new customer) những gì tôi muốn là khả năng lấy ví dụ cho khách hàng (1) 1 là id và trả về ví dụ là tên và họ của khách hàng – Kavvson

+0

Vì vậy, bạn muốn "chọn * từ khách hàng WHERE customer_id = 1", sau đó danh sách khách hàng của bạn chứa chính xác một mục? – Neolisk

Trả lời

5

a Listy query has for example 50k rows so it can become slow

Trong trường hợp đó, DB của bạn có thể được thiết kế kém hoặc có cấu trúc hoặc truy vấn SQL có thể là tối ưu phụ. 50k không phải là rất nhiều dữ liệu, và tải trước tất cả các dữ liệu và sử dụng 3 lớp để mã tay cùng một kết quả là không có khả năng nhanh hơn rất nhiều, nhưng sẽ dễ bị lỗi hơn.

Điều đó nói rằng, chức năng display_single_name() của bạn có thể khá đơn giản. Giả sử: danh sách

  • Các chỉ gửi thư dữ liệu được nạp ở đâu đó như một List(of MailItem)
  • Ứng dụng này có một cái gì đó giống như Customer Class và một danh sách (của khách hàng)
  • Chúng ta biết rằng ByWho và ForWho là FKS, nhưng những gì họ là FKs đến vẫn chưa rõ ràng. Tôi giả sử khách hàng vì không có diễn viên khác được đề cập

Các mã hiện không có nơi để lưu trữ thông tin này, do đó, một vài thay đổi:

Class Customer 
    ... 
    Public ReadOnly Property FullName As String 
     Get 
      Return String.Format("{0} {1}", Name, LastName) 
      ' or 
      'Return String.Format("{0}, {1}", LastName, Name) 
     End Get 
    End Property 
    ... 

Public Class MailItem ' AKA "listy" 

    Public Property CustomerID As Integer 
    Public Property CustomerName As String 

    Public Property ListNumber As String 
    Public Property ListCount As Integer 

    Public Property ByWhomID As Integer 
    Public Property ByWhomName As String 

    Public Property ForWhomID As Integer 
    Public Property ForWhomName As String 

    Public Property Priority As Integer 
    ...etc 

Sau đây sử dụng myMailItems mà là một List(Of MailItem) để lưu trữ thông tin mục thư bao gồm tên đã được giải quyết được cung cấp cho nó và CustListList(of Customer). Điều này về cơ bản sẽ có chức năng cơ bản là Core.init_customers() nhưng không có nhu cầu thực sự cho nó là một lớp đặc biệt.

' loading the MailItems ("listy") into a 
    ' list(of MainItem) ("gridDataList"??? it is never used in the OP code 
    ' rdr is a SQLReader 
    Dim mi As New MailItem(Convert.ToInt32(rdr.Item("ID")) 
          ... all the other fields) 

    Dim tmpCust As Customer 

    ' load the names of the actors from the ID: 
    tmpCust = GetCustomerByID(mi.CustomerID) 
    If tmpCust IsNot Nothing Then 
     mi.CustomerName = tmpCust.FullName 
    Else 
     mi.CustomerName = "Unknown!" 
    End If 

    tmpCust = GetCustomerByID(mi.ForWhomID) 
    If tmpCust IsNot Nothing Then 
     mi.ForWhomName = tmpCust.FullName 
    Else 
     mi.ForWhomName = "Unknown!" 
    End If 

    tmpCust = GetCustomerByID(mi.ByWhomID) 
    If tmpCust IsNot Nothing Then 
     mi.ByWhomName = tmpCust.FullName 
    Else 
     mi.ByWhomName = "Unknown!" 
    End If 

    ' the actor names are resolved, add to the list: 
    myMailItems.Add(mi) 

Các tra cứu khách hàng được giải quyết thông qua một hàm helper:

Private Function GetCustomerByID(id As Integer) As Customer 
    Dim cust As Customer = CustList.Find(Function(x) x.ID = id) 

    Return cust 
End Function 

Trong dữ liệu mẫu, bạn muốn gọi nó với 7, 3 và 202 (rõ ràng) để có được tên của khách hàng liên quan. Tuy nhiên, thuộc tính mới FullName được định dạng theo ý bạn, trả về tên để lưu trữ trong danh sách.

Lớp MailItem có thể thực hiện tra cứu chính nó trong hàm tạo, miễn là nó có tham chiếu đến danh sách Khách hàng. Tất nhiên, nó cũng có thể làm một SQL tìm kiếm để có được tên (s) cho mỗi diễn viên là tốt.


biến thể cho nhìn lên:

' a simple loop: 
For Each Cust As Customer In CustList 
    If Cust.Id = id Then Return Cust 
End If 
Return Nothing   

Recraft chức năng để có được tên:

Function CustmerNameFromID(id as Integer) As String 
    ' or use the loop variant here 
    Dim cust As Customer = CustList.Find(Function(x) x.ID = id) 
    ' test for Nothing here rather than in data load proc 
    If cust IsNot Nothing Then 
     Return cust.FullName 
    Else 
     Return "" 
    End If 

End Function 

' use: 
mi.CustomerName = CustmerNameFromID(mi.ID) 

Lưu ý:

này là do không có phương tiện một solutio tốt hơn n so với truy vấn SQL JOIN; nhưng nó dường như là những gì bạn đang tìm kiếm.

Để tra cứu để làm việc, bạn phải mang tất cả khách hàng trong DB với máy PC client chỉ trong trường hợp họ sức mạnh được sử dụng trong "listy" bộ dữ liệu hiện hành. Sau đó, mã phải tạo một đối tượng cho mỗi và lưu trữ nó. Điều đó sẽ mất thời gian và trí nhớ.

Một thay thế sẽ được bắn ra tra cứu SQL để có được cust # 3 khi cần thiết và bộ nhớ cache/lưu trữ nó trong một danh sách, vì vậy nếu nó được nhìn thấy một lần nữa bạn có thể tái sử dụng nó và chỉ nhấn DB nếu nó không phải là trong danh sách. Nhưng một lần nữa, bạn chỉ đang làm trong mã những gì có thể được thực hiện với một truy vấn SQL JOIN thích hợp.

+0

Làm rõ câu hỏi của tôi hãy xem nó. Câu trả lời của bạn có thể là một phần tốt tôi có thể cần hiển thị là tốt. – Kavvson

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