嗔秤戻幣�哉膵�云利匈嬉蝕湊蛸賜�塋床四衲���萩晦編報炎嘔囚^泡仟 ̄云利匈��
源平慎弌傍利 卦指云慕朕村 紗秘慕禰 厘議慕尺 厘議慕禰 TXT畠云和墮 〆辺茄欺厘議箝誓匂〇

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 
卦指朕村 貧匯匈 和匯匈 指欺競何 壘��13�� 家��12��
酔楯荷恬: 梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈 梓囚徒貧議 Enter 囚辛指欺云慕朕村匈 梓囚徒貧圭�鮗� ● 辛指欺云匈競何!
梁椣戻幣�� 梁心弌傍議揖扮窟燕得胎��傍竃徭失議心隈才凪万弌誌育断蛍�輌臆惨軼僑〃�燕慕得珊辛參資誼持蛍才将刮襲潜��範寔亟圻幹慕得 瓜寡追葎娼得辛參資誼寄楚署衛、持蛍才将刮襲潜填��