2014-12-01 107 views
8

您好,我在创建我的学校项目时遇到了问题。基于密钥检索班级价值

一些描述:

Listy - 它的一个对象,并且其被一个SQL查询所附和后来成为listbinding。 客户 - 客户端:ID,姓名,姓

Listy sql中倾倒例如

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

问题

我的数据网格视图看起来完全相同的方式作为MySQL的结果,我想什么get是一个更友好的显示,所以如果我得到了202(它的一个客户ID)我想在数据网格视图中显示示例名称示例姓氏。它必须以某种方式使用此代码完成。另外一个很好的功能是能够以某种方式删除和更新Class客户。

级核心

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 

级客户

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 

类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

您的问题目前混入了许多技术性的热门词汇,并且几乎没有提供有关该问题的有用信息。不要试图解释代码或尝试的方法。尝试用英语解释你试图解决的实际问题。尝试尽可能具体,使用20个字左右。然后你可以详细阐述它。 – Neolisk 2014-12-06 19:36:31

+0

@Neilisk好吧,让我缩短这个:Class Customers(get/set property),我有一个函数将sql结果附加到类的客户(list.add新客户)我想要的是能够获得例如客户1)1是id并且示例返回是客户的姓名 – Kavvson 2014-12-06 22:07:39

+0

因此,您想要“从客户的select * customer_id = 1”,然后您的客户列表中只包含一个项目? – Neolisk 2014-12-06 22:40:17

回答

5

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

在这种情况下,您的数据库设计或结构可能很差,或者SQL查询可能是次优的。 50k并不是很多数据,并且预加载所有数据并使用3个类来手动编写相同的结果不会很快,但会更容易出错。

也就是说,你的display_single_name()函数可能很简单。假设:

  • 邮件列表数据的地方装像List(of MailItem)
  • 应用程序有类似的Customer类和List(客户的)
  • 我们知道,ByWho和ForWho是FKS,但什么他们是FKs 目前尚不清楚。我假设客户因为没有其他演员提到

现有的代码有没有地方来存储这些信息,所以一些改动:

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 

下使用myMailItems这是一个List(Of MailItem)存储包含解析名称的邮件项目信息以及CustListList(of Customer)。这在功能上基本上是Core.init_customers(),但没有真正需要它成为一个特殊的班级。

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

客户查找通过辅助函数解析:

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

    Return cust 
End Function 

在样本数据,你会调用它与7,3和202(显然)来获取相关的客户名称。不管你喜欢什么,格式化新的FullName属性都会返回存储在列表中的名称。

MailItem类可以在构造函数中执行查找,前提是它具有对Customer列表的引用。当然,它也可以执行SQL查找以获取每个演员的姓名。


变数的抬头:

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

Recraft的函数来获取名称:

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) 

注:

这绝非更好的解决方案n比SQL JOIN查询;但它似乎是你在找什么。

为了查找工作,你必须把所有客户在DB到客户端PC 以防万一他们可能在目前“listy”数据集中使用。然后,代码必须为每个对象创建一个对象并存储它。这将需要时间和记忆。

需要和它的缓存/存储在一个列表时,另一种方法是,以火过SQL查询来获得卡斯特#3,所以如果它再次看到你可以重复使用它,只打了DB如果不是在列表中。但是,再次,您只是在代码中执行正确的SQL JOIN查询。

+0

澄清我的问题看看它。您的答案可能部分不错,我可能也需要显示器。 – Kavvson 2014-12-07 08:56:29