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

VB2008貫秘壇欺娼宥(PDF鯉塀哂猟井)-及73何蛍

酔楯荷恬: 梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈 梓囚徒貧議 Enter 囚辛指欺云慕朕村匈 梓囚徒貧圭�鮗� ● 辛指欺云匈競何! 泌惚云慕短嗤堋響頼���誅卒亮茂�俊彭堋響��辛聞喘貧圭 "辺茄欺厘議箝誓匂" 孔嬬 才 "紗秘慕禰" 孔嬬��



    Dim cmd As IDbmand = _ 

      New Sqlmand�─�INSERT INTO draws ��draw_date�察�first_number�察�second_number�察 ─�_ 

                                       & ;third_number�察�fourth_number�察 ─�_ 

                                       & ;fifth_number�察�sixth_number�察�bonus�� ; _ 

                   & ;VALUES ��@pDrawDate�察�@pFirstNumber�察�@pSecondNumber�察 ─�_ 

          & ;@pThirdNumber�察�@pFourthNumber�察�@pFifthNumber�察�@pSixthNumber�察�@pBonus��;�� 



    cmd。Connection = connection 



    Dim paramDate As IDbDataParameter = New SqlParameter�┌� 

    paramDate。ParameterName = ;@pDrawDate; 

    paramDate。DbType = System。Data。DbType。DateTime 

    paramDate。Size = 8 

    paramDate。SourceColumn = ;draw_date; 

    paramDate。Value = DateTime。Now 

    cmd。Parameters。Add��paramDate�� 



    Dim param As IDbDataParameter = New SqlParameter�┌� 

    param。ParameterName = ;@pFirstNumber; 

    param。DbType = System。Data。DbType。Int32 

    param。Size = 4 

    param。SourceColumn = ;first_number; 

    param。Value = 1 

    cmd。Parameters。Add��param�� 



    。 。 。 



    param = New SqlParameter�┌� 

    param。ParameterName = ;@pBonus; 

    param。DbType = System。Data。DbType。Int32 

    param。Size = 4 

    param。SourceColumn = ;bonus; 

    param。Value = 1 

    cmd。Parameters。Add��param�� 



    Dim retval As Integer = cmd。ExecuteNonQuery�┌� 

    Console。WriteLine�─�retval �──�& retval & ;��;�� 

    connection。Close�┌� 



     To execute a mand�察�you need to instantiate a class that implements the  IDbmand  

interface�察�where the constructor parameter is the SQL statement that you want to execute。 The  

SQL statement contains SQL parameters。 How a SQL parameter is defined often depends on  

the ADO implementation。 The mand is associated with the database connection using  

the cmd。Connection property。 

     Each parameter�察�regardless of the database driver used�察�is of type  IDataParameter or  

IDbDataParameter ��which implements IDataParameter��。 The type associated with IDbDataParameter  

is SqlParameter in this case�察�because we are using SQL Server。 


´´´´´´´´´´´´´´´´´´´´´´Page 406´´´´´´´´´´´´´´´´´´´´´´´

384       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 



                The properties of IDbDataParameter are as follows�此�



               o  ParameterName�此�Specifies the name of the parameter and must be prefixed with an at sign  

                  ��@�� character。 



               o  DbType�此�Specifies the type of the parameter。 



               o  Size�此�Specifies the size of the parameter ��in bytes��。 



               o  SourceColumn�此�Specifies in which column the parameter will be stored。  



               o  Value�此�Specifies the value for the parameter。 



          *Note  As a general rule of thumb�察�stick to using and manipulating the standard ADO interfaces�察�rather  

          than the types specific to the ADO driver。 



                The example shows code that you would write when you want to explicitly define the  

          attributes of every parameter。 This was to allow you to see what is happening when parameters  

          are converted and stored in a table。 A simpler notation is as follows�此�



          Dim connection As IDbConnection = _ 

            New SqlConnection��DatabaseConsoleEx。My。Settings。Default。lotteryConnectionString�� 

          connection。Open�┌� 



          Dim cmd As IDbmand = New Sqlmand�─�INSERT INTO draws ��draw_date�察 ─�_ 

                  & ;first_number�察�second_number�察�third_number�察�fourth_number�察 ─�_ 

                               & ;fifth_number�察�sixth_number�察�bonus�� VALUES ��@pDrawDate�察 ─�_ 

                               & ;@pFirstNumber�察�@pSecondNumber�察�@pThirdNumber�察─�_ 

                               & ;@pFourthNumber��@pFifthNumber��@pSixthNumber��@pBonus��;�� 



          cmd。Connection = connection 



          cmd。Parameters。Add��New SqlParameter�─�@pDrawDate;�察�DateTime。Now���� 

          cmd。Parameters。Add��New SqlParameter�─�@pFirstNumber;�察�10���� 

          cmd。Parameters。Add��New SqlParameter�─�@pSecondNumber;�察�1���� 

          cmd。Parameters。Add��New SqlParameter�─�@pThirdNumber;�察�30���� 

          cmd。Parameters。Add��New SqlParameter�─�@pFourthNumber;�察�19���� 

          cmd。Parameters。Add��New SqlParameter�─�@pFifthNumber;�察�2���� 

          cmd。Parameters。Add��New SqlParameter�─�@pSixthNumber;�察�21���� 

          cmd。Parameters。Add��new SqlParameter�─�@pBonus;�察�5���� 



                Once you have defined the parameters and assigned them with a value�察�the SQL query can  

          be executed。 In the case of a SQL  INSERT statement�察�no data will be returned�察�because you are  

          sending data from the application to the database。 Thus�察�you will need to execute the method  

          that does not expect any return data�察�which is  ExecuteNonQuery�┌��察�like this�此�


´´´´´´´´´´´´´´´´´´´´´´Page 407´´´´´´´´´´´´´´´´´´´´´´´

                                      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 385 



Dim retval As Integer = cmd。ExecuteNonQuery�┌� 

Console。WriteLine�─�retval �──�& retval & ;��;�� 



      ExecuteNonQuery�┌� returns the number of rows affected by the statement ��which should be  

1�察�because we¨ve inserted one row��。 



Selecting Data from a Table 



After your tables have some data�察�you probably will want to retrieve the data。 To do that�察�you  

use the SELECT statement。 Here is the code for viewing data in the draws table�此�



Dim connection As IDbConnection = _ 

  New SqlConnection��DatabaseConsoleEx。My。Settings。Default。lotteryConnectionString�� 

connection。Open�┌� 



Dim cmd As IDbmand = New Sqlmand�─�SELECT * FROM draws;�� 

cmd。Connection = connection 

Dim reader As IDataReader = cmd。ExecuteReader�┌� 

While reader。Read�┌� 

    Console。WriteLine�─┌──�& reader。GetDateTime��0��。ToString�┌� & ;�� ; _ 

      & reader。GetInt32��1���� 

End While 



reader。Close�┌� 

connection。Close�┌� 



     To select data�察�the steps are to open a connection�察�create a mand�察�and execute the  

mand。 In the example�察�the SELECT statement did not have any parameters。 SELECT * means  

to select all columns。 Alternatively�察�you could define identifiers to select specific columns。 

     When you are using a SELECT statement�察�the server will return data。 To read the returned  

data�察�you call the method ExecuteReader�┌��察�which will also execute the mand。 This is different  

from the ExecuteNonQuery�┌� method you use to insert data�察�mainly in that ExecuteReader�┌� returns  

an instance of IDataReader。 IDataReader is an interface used to iterate individual records�察�which  

gives you the chance to retrieve the individual fields of the records�察�and you can examine the  

data in the columns for each record。  

     To access the fields�察�use the appropriate GetNNN �┌� method�察�with the index of the field。  

Knowing which index to use is a bit perplexing。 The index of the appropriate field is related to  

the position of the column in the SELECT mand ��though�察�in this case�察�we¨ve selected all the  

data with *�察�so it depends on the position of the column in the table��。 For example�察�the following  

code retrieves the fourth column from a result set。  



reader。GetDouble��3�� 



     In our example�察�we obtain the date and the first draw number。 


´´´´´´´´´´´´´´´´´´´´´´Page 408´´´´´´´´´´´´´´´´´´´´´´´

386       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 



          Deleting Data from the Database 



          Of course�察�you may need to delete data from table。 The SQL statement for removing data from  

          a table is DELETE。 The following example deletes a particular lottery drawing entry from the  

          draws table。 



          Dim cmd As IDbmand = _ 

            New Sqlmand�─�DELETE FROM draws WHERE draw_date=@pDrawDate;�察�_ 

                           CType��connection�察�SqlConnection���� 



          Dim paramDate As IDbDataParameter = New SqlParameter�┌� 

          paramDate。ParameterName = ;@pDrawDate; 

          paramDate。DbType = System。Data。DbType。DateTime 

          paramDate。Size = 8 

          paramDate。SourceColumn = ;draw_date; 

          paramDate。Value = DateTime。Now 

          cmd。Parameters。Add��paramDate�� 



          cmd。ExecuteNonQuery�┌� 

          connection。Close�┌� 



               As with the  INSERT statement�察�you use  ExecuteNonQuery�┌� with DELETE�察�which does not  

          return any results ��except for the number of rows affected by the mand��。 



          Recapping ADO Usage 



          Looking at all of the code presented in this section�察�you should notice the following points  

          about using ADO directly�此�



               o There are general interfaces�察�implemented by a specific library。  



               o The IDbConnection and IDbmand interfaces are implemented by all ADO drivers。 



               o  SqlConnection�察�Sqlmand�察�and SqlParameter are specific classes from the database driver。 



               o The database code involves opening a connection�察�defining a SQL mand such as  

                  INSERT�察�SELECT�察�and so on�察�assigning the SQL parameters�察�executing the SQL mand�察 �

                 and then closing the connection。 



          *Note  For more details on SQL�察�see Wikipedia¨s SQL entry ��http��//en。wikipedia。org/wiki/SQL�� and  

          W3School¨s SQL tutorial ��http��//w3schools。/sql/default。asp��。 These provide a good expla

          nation of the basics of SQL。 The MSDN documentation is fairly good as well。 



               Next�察�let¨s take a look at another Visual Studio tool for working with database applications。 


´´´´´´´´´´´´´´´´´´´´´´Page 409´´´´´´´´´´´´´´´´´´´´´´´

                                       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 387 



Using the Dataset Designer 



The Dataset Designer is a utility provided by Visual Basic Express to help you write database  

applications。 MSDN provides a detailed tutorial on how to create client data applications  

��http��//msdn2。microsoft。/en´us/library/h0y4a0f6。aspx��。 The tutorial describes how to  

click options and use the wizards�察�but it does not explain some of the underlying details。 Here�察 �

we¨ll use the Dataset Designer to set up the relations between the lottery database tables�察�and  

take a look at the code that is generated automatically to create those relations。 

     A  dataset is an in´memory representation of the data in the database。 It is used for manip

ulating the data away from the database server before you update the database。 This disconnected  

form of working with the data improves performance�察�because you reduce the number of times  

you need to query the database server。 



Building Relations Between Tables 



The first step in using the Dataset Designer is to convert the tables in the Database Explorer to  

something that the Dataset Designer can use。 To do this�察�from the Solution Explorer�察�double

click the file that has the extension  。xsd!lotteryDataSet。xsd in our example。 The  。xsd file is  

the XML Schema Definition file�察�which translates the database¨s datasets into XML files。  

     The lotteryDataSet。xsd file has a number of child files�察�which you can open and inspect。  

These files are part of a collection that is used by the Dataset Designer。 The only file that you  

can modify is lotteryDataSet。vb ��which you can view by right´clicking  lotteryDataSet。xsd  

and selecting View Code��。 The other files are managed by the Dataset Designer。  

     We want to build relations between the three tables。 Relations are important because they  

allow you to maintain database consistency。 For example�察�imagine adding a winner to the  

winners table for a lottery drawing date that does not exist。 Using relations�察�you can enforce a  

consistency check�察�so that the drawing date must exist in the database before you can add a  

winner for that date。 We will define two relations�此�winners with draws and winners with persons。  

Remember that the winners table is a cross´reference between the persons and draws table。 

     Follow these steps to define the relations�此�



     1。  Double´click lotteryDataSet。xsd in the Solution Explorer。 You will see a message indi

         cating that the Dataset Designer has no data。 



     2。  Drag and drop each of the three tables you created earlier from the Database Explorer  

         onto the surface of the Dataset Designer�察�as shown in Figure 14´6。 This automatically  

         adds default support for the three tables。 



        Figure 14´6。 Dataset Designer with the three tables 


´´´´´´´´´´´´´´´´´´´´´´Page 410´´´´´´´´´´´´´´´´´´´´´´´

388        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 



                 3。  To build a relation�察�right´click the data generator surface and choose Add  Relation。  

                     The Relation dialog box appears。 This dialog box allows you to associate two tables via  

                     a specific field。  



                 4。  As shown in Figure 14´7�察�specify winners as the parent table and  persons as the child。  

                     The key column is  id。 Click OK to create the relation。 



                   Figure 14´7。 Creating the winners and persons relation 



                 The winners and draws relation is created in the same way as the winners and persons relation�察 �

           except that the columns linked are draw_date�察�as shown in Figure 14´8。 

                 After you have created both relations�察�the Dataset Designer surface should look like  

           Figure 14´9。 

                 Figure 14´9 illustrates a well´defined database structure that includes relations。 The structure  

           is very important for the Dataset Designer�察�because it defines how the generated code will appear。  

           Look closely at Figure 14´9 and notice how each table representation shows Fill�察�GetData�┌� at  

           the bottom。 The Fill�┌� and GetData�┌� methods are used to retrieve the data from the database  

           and convert it into data that Visual Basic can process。 


´´´´´´´´´´´´´´´´´´´´´´Page 411´´´´´´´´´´´´´´´´´´´´´´´

                                            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 389 



Figure 14´8。 Creating the winners and draws relation 



Figure 14´9。 Dataset Designer surface with all tables and relations 



      If you were to click the table adapter�察�the Dataset Designer would display the properties�察 �

similar to Figure 14´10。 


´´´´´´´´´´´´´´´´´´´´´´Page 412´´´´´´´´´´´´´´´´´´´´´´´

390       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 



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