嗔秤戻幣�哉膵�云利匈嬉蝕湊蛸賜�塋床四衲���萩晦編報炎嘔囚^泡仟 ̄云利匈��
VB2008貫秘壇欺娼宥(PDF鯉塀哂猟井)-及74何蛍
酔楯荷恬: 梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈 梓囚徒貧議 Enter 囚辛指欺云慕朕村匈 梓囚徒貧圭�鮗� ● 辛指欺云匈競何! 泌惚云慕短嗤堋響頼���誅卒亮茂�俊彭堋響��辛聞喘貧圭 "辺茄欺厘議箝誓匂" 孔嬬 才 "紗秘慕禰" 孔嬬��
Figure 14´10。 Properties of Dataset Designer table structure
The properties show the exact syntax of the SQL INSERT and SELECT mands。 Remember
these two statements are used to add and select data from database tables。 This illustrates that
the Dataset Designer code is no different than the ADO code ��except the dataset is a cache��。
Now consider the following code�察�generated by the Dataset Designer�察�to bind the columns
of the draws table to the generated data structure ��in lotteryDataSet。Designer。vb��。
_
Private Sub InitAdapter�┌�
Me。_adapter = New Global。System。Data。SqlClient。SqlDataAdapter
Dim tableMapping As Global。System。Data。mon。DataTableMapping =
New Global。System。Data。mon。DataTableMapping
tableMapping。SourceTable = ;Table;
tableMapping。DataSetTable = ;draws;
tableMapping。ColumnMappings。Add�─�draw_date;�察 �draw_date;��
tableMapping。ColumnMappings。Add�─�first_number;�察 �first_number;��
tableMapping。ColumnMappings。Add�─�second_number;�察 �second_number;��
tableMapping。ColumnMappings。Add�─�third_number;�察 �third_number;��
tableMapping。ColumnMappings。Add�─�fourth_number;�察 �fourth_number;��
tableMapping。ColumnMappings。Add�─�fifth_number;�察 �fifth_number;��
tableMapping。ColumnMappings。Add�─�sixth_number;�察 �sixth_number;��
tableMapping。ColumnMappings。Add�─�bonus;�察 �bonus;��
Me。_adapter。TableMappings。Add��tableMapping��
Me。_adapter。Insertmand = New Global。System。Data。SqlClient。Sqlmand
Me。_adapter。Insertmand。Connection = Me。Connection
Me。_adapter。Insertmand。mandText = ;INSERT INTO ��dbo�А���draws�А �
�┌�draw_date�В察。�first_number�В察。�second_number�В察。�third_n;& _
;umber�В察。�fourth_number�В察。�fifth_number�В察。�sixth_number�В察。�bonus�В�
´´´´´´´´´´´´´´´´´´´´´´Page 413´´´´´´´´´´´´´´´´´´´´´´´
C HA P TE R 1 4 * L E AR N I N G AB O U T R E L AT IO N A L D AT AB A SE D A TA 391
VALUES ��@draw_;& _
;date�察�@first_number�察�@second_number�察�@third_number�察�@fourth_number�察 �
@fifth_numbe;& _
;r�察�@sixth_number�察�@bonus��;
Me。_adapter。Insertmand。mandType = Global。System。Data。mandType。Text
Me。_adapter。Insertmand。Parameters。Add��New
Global。System。Data。SqlClient。SqlParameter�─�@draw_date;�察 �
Global。System。Data。SqlDbType。DateTime�察�0�察 �
Global。System。Data。ParameterDirection。Input�察�0�察�0�察 �draw_date;�察 �
Global。System。Data。DataRowVersion。Current�察�false�察�Nothing�察 ─┌察 ─┌察 ─┌���
Me。_adapter。Insertmand。Parameters。Add��New
Global。System。Data。SqlClient。SqlParameter�─�@first_number;�察 �
Global。System。Data。SqlDbType。Int�察�0�察 �
Global。System。Data。ParameterDirection。Input�察�0�察�0�察 �first_number;�察 �
Global。System。Data。DataRowVersion。Current�察�false�察�Nothing�察 ─┌察 ─┌察 ─┌���
。 。 。
End Sub
The bolded code shows how close the generated code is to a variation of the code used to
insert data in the ADO section。 The generated code is more explicit and verbose than the
previous code�察�but that does not matter�察�since you are not supposed to edit the generated code。
You are supposed to use the Dataset Designer。
*Note The Dataset Designer gives you the advantage of not having to provide bindings between Visual
Basic and a database�察�and an easy binding between a user interface and the database。 By providing a GUI
where you can drag�察�drop�察�and so on�察�the Dataset Designer just makes it much simpler to write that code。
Using the Generated Code
Using the code generated by the Dataset Designer is easy�察�as long as you know what is going on。
The Dataset Designer generates two major pieces of code�此�a table adapter and a dataset。 The
table adapter is code used to interact with the table directly and is the link between your code
and the database。 If you wanted to add�察�select�察�or delete items�察�use the table adapter。 When you
select data�察�the data will fill a dataset。
The following is the code to insert a record into the draws table ��in the DatabaseConsoleEx
application��。
Dim table As DatabaseConsoleEx。lotteryDataSetTableAdapters。drawsTableAdapter = _
New DatabaseConsoleEx。lotteryDataSetTableAdapters。drawsTableAdapter�┌�
table。Insert��DateTime。Now�察�2�察�12�察�14�察�31�察�18�察�4�察�20��
The code is a trivial two´liner。 It instantiates the drawsTableAdapter�察�and then calls the
Insert�┌� method to add a record。 Connecting to the database�察�executing the mand�察�and
assigning the parameters are done automatically。
´´´´´´´´´´´´´´´´´´´´´´Page 414´´´´´´´´´´´´´´´´´´´´´´´
392 CH AP T E R 1 4 * L E A R N I N G A B OU T R E L A TI O N AL DA TA B AS E D AT A
*Note Generated code is both a blessing and a curse。 Generated code hides plexity and makes it
simpler for you to get your job done。 But as you saw in the code excerpts�察�there is quite a bit going on behind
the scenes�察�and if you don¨t understand ADO�察�you will not know what to do when things go wrong。 For
example�察�when is a connection to the database made�拭�The only way to know that is to look at the generated
source code and follow the ADO calls。 A connection to a database is made the first time you call one of
the SQL methods ��for example�察 �Insert�┌����察�not when the adapter is initialized。
To retrieve and iterate the data in the table�察�use the following code。
Dim dataset As DatabaseConsoleEx。lotteryDataSet = _
New DatabaseConsoleEx。lotteryDataSet�┌�
Dim table As DatabaseConsoleEx。lotteryDataSetTableAdapters。drawsTableAdapter = _
New DatabaseConsoleEx。lotteryDataSetTableAdapters。drawsTableAdapter�┌�
Dim count As Integer = table。Fill��dataset。draws��
Console。WriteLine�─�Record count is �──�& dataset。draws。Count & ;���──�& count & ;��;��
For Each row As DatabaseConsoleEx。lotteryDataSet。drawsRow In dataset。draws
Console。WriteLine�─�Date �──。� row。draw_date。ToString�┌� & ;�� �──�_
& row。first_number & ;��;��
Next
The variable table is initialized to an adapter that connects to the draws table。 The variable
dataset is an empty collection ready for the draws table。
To fill the data table in the dataset�察�the method table。Fill�┌� is called�察�and the destination
is the dataset。draws data table。 After having called Fill�┌��察�the number of records read is returned
and assigned to count。
To iterate the individual rows�察�a For Each loop is used。 It references the type drawsRow�察�and
each instance of drawsRow has data members that represent the draw_date�察�first_number�察�and
other columns。 The iteration of the individual rows resembles the iteration of a collection。 The
ADO example used a While loop and required you to know which column was associated
with which SELECT field。
The Important Stuff to Remember
In this chapter�察�you learned about the basics of ADO and the Dataset Designer。 Here are
the main points to remember�此�
o The real problem when using a relational database and a programming language like
Visual Basic is the mismatch of set´based operations and individual object operations。
o To access a relational database�察�you can use ADO。 There is an ADO database
driver for each relational database。
o The Dataset Designer code is based on ADO�察�and thus if you understand ADO�察�you
will be able to understand how the Dataset Designer works and how it can be optimized。
´´´´´´´´´´´´´´´´´´´´´´Page 415´´´´´´´´´´´´´´´´´´´´´´´
C HA P TE R 1 4 * L E AR N I N G AB O U T R E L AT IO N A L D AT AB A SE D A TA 393
o When using ADO�察�the steps are typically to connect to a database�察�create a mand�察 �
populate the parameters�察�execute the mand�察�retrieve the data ��if necessary���察�close
the mand�察�and close the connection。
o SQL is a language used to manipulate the tables of a relational database。 You need to
learn SQL on top of learning how to use ADO。
Some Things for You to Do
The following are two exercises for applying what you¨ve learned in this chapter。
1。 The basis of the lottery application is defined in terms of a database�察�tables�察�and data。
Write a console application that populates the draws table using a lottery file。 Write a
console application that dumps the contents of the draws table as a lottery file。
2。 Create a console application that accepts as mand´line arguments a winner and
the date of the draw。 Your console application must account for doubles and populate
both the persons and winners tables。
´´´´´´´´´´´´´´´´´´´´´´Page 416´´´´´´´´´´´´´´´´´´´´´´´
´´´´´´´´´´´´´´´´´´´´´´Page 417´´´´´´´´´´´´´´´´´´´´´´´
C H A P T E R 1 5
* * *
Learning About LINQ
In the previous chapter�察�you learned about how to access a database using the traditional
ADO technologies。 When you make ADO requests�察�you are making SQL calls and
organizing the result set data using SQL。
Language Integrated Query ��LINQ�� is a technology that lets you organize your results in a
consistent manner�察�regardless of the underlying source of the data。 Why yet another technology
to query information�拭�The answer is related to XML。
XML is a technology used to represent information in a hierarchical manner。 You saw an
example of XML in Chapter 12。 XML has solved many problems in an elegant and understand
able manner。 One of the solutions proposed by XML is the ability to reference information in
an XML structure with XPath�察�which is a way of referencing an object structure using a set of
filters。 Using XPath�察�you can find any node�察�and the filters can include the presence of depen
dent elements�察�which is not easily possible in other technologies。 Put simply�察�XPath and XML
are very powerful techniques used to find information。
You can consider XML and XPath as inspiration for LINQ。 Where LINQ and XML XPath
deviate is that LINQ can be used to query Visual Basic collection objects�察�XML documents�察�and
relational databases。 Think of LINQ as a general mechanism used to search a collection of
information。 The focus of this chapter will be to explain the mechanics of LINQ�察�and demon
strate how to write queries and use the methods associated with the LINQ library。
Finding the Frequency of Winning Numbers
The lottery application we¨ve been working with in previous chapters collects information
about lottery drawings to predict the next set of winning lottery numbers。 The idea is to find
patterns。 Again�察�the reality is that lottery drawings are random�察�so even if you could identify
patterns�察�that wouldn¨t mean you could predict winning numbers。 However�察�what is interesting
about this problem is that you can use LINQ to slice and dice the data。 LINQ lets you keep the
data as objects�察�and to perform SQLand XPath´like operations�察�as you¨ll see in this chapter。
In Chapter 10�察�you saw a streaming architecture�察�where a console application read in text
data and spat out text data。 You also saw examples of text´to´binary and binary´to´text conver
sions。 The application in this chapter ��in the FrequencyProcessor project�� will read in text�察�process
the data�察�and then generate text describing the frequency of lottery numbers。 Thus�察�we need to
use the text´to´text interface�察�which was defined in Chapter 10 as follows�此�
395
´´´´´´´´´´´´´´´´´´´´´´Page 418´´´´´´´´´´´´´´´´´´´´´´´
396 CH AP T E R 1 5 * L E A R N I N G A B OU T L I N Q
Public Interface IProcessor
Function Process��ByVal input As String�� As String
End Interface
The input is a text stream that looks like this�此�
2006。03。11 3 7 15 28 30 38 44
2006。03。15 10 18 30 34 41 43 5
2006。03。18 3 11 12 16 20 40 9
2006。03。22 2 3 7 13 42 43 41
2006。03。25 3 10 36 40 43 44 35
2006。03。29 3 4 8 16 34 39 45
If you want to find the frequency of the individual numbers�察�you could parse each individual
number�察�and then increment the count of the individual number as an array�察�like this�此 �
Dim frequency As Integer = 0
Dim splitUpText�┌� As String = lineOfText。Split��New Char�┌� ��; ;c����
frequency��Integer。Parse��splitUpText��0������ ��= 1
frequency��Integer。Parse��splitUpText��1������ ��= 1
。 。 。
The split line of text contains the list of numbers�察�separated by spaces�察�which is then converted
to a series of numbers�察�each of which is used as an index for the frequency。 The solution is fast
and works�察�but it has a big problem�此�it is not extendable。 The solution solves a single problem
and only a single problem。
For example�察�let¨s say that you want to figure out other statistical information�察�such as which
numeric binations occur most often。 Using the previous solution�察�that would require
reparsing the text stream again。 That is an expensive and tedious solution。 The better solution
would be to convert the stream into a series of objects that could be processed。
However�察�the problem at hand is calculating the frequency of individual numbers。 So why
exert the extra effort if the solution that solves the single problem works�拭�Writing good code
means solving problems using a generic but specific approach。 You want to write specific code
so that you do not get bogged down in thinking about details in the future�察�and you want to
write generic code so that any future requirement does not cause you to pletely rewrite the
old application。 Knowing when to write specific code and when to write generic code is really
a matter of experience!the only way to learn is to write code。
Extending the Lottery´Prediction System
酔楯荷恬: 梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈 梓囚徒貧議 Enter 囚辛指欺云慕朕村匈 梓囚徒貧圭�鮗� ● 辛指欺云匈競何!
梁椣戻幣�� 梁心弌傍議揖扮窟燕得胎��傍竃徭失議心隈才凪万弌誌育断蛍�輌臆惨軼僑〃�燕慕得珊辛參資誼持蛍才将刮襲潜��範寔亟圻幹慕得 瓜寡追葎娼得辛參資誼寄楚署衛、持蛍才将刮襲潜填��