基于密钥检索班级价值
您好,我在创建我的学校项目时遇到了问题。基于密钥检索班级价值
一些描述:
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
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)
存储包含解析名称的邮件项目信息以及CustList
是List(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查询。
澄清我的问题看看它。您的答案可能部分不错,我可能也需要显示器。 – Kavvson 2014-12-07 08:56:29
您的问题目前混入了许多技术性的热门词汇,并且几乎没有提供有关该问题的有用信息。不要试图解释代码或尝试的方法。尝试用英语解释你试图解决的实际问题。尝试尽可能具体,使用20个字左右。然后你可以详细阐述它。 – Neolisk 2014-12-06 19:36:31
@Neilisk好吧,让我缩短这个:Class Customers(get/set property),我有一个函数将sql结果附加到类的客户(list.add新客户)我想要的是能够获得例如客户1)1是id并且示例返回是客户的姓名 – Kavvson 2014-12-06 22:07:39
因此,您想要“从客户的select * customer_id = 1”,然后您的客户列表中只包含一个项目? – Neolisk 2014-12-06 22:40:17