ÔÚ ADO ºÍ ADO.NET ÖйÜÀíÀëÏßÊý¾Ý

·¢²¼ÈÕÆÚ£º 10/26/2004 | ¸üÐÂÈÕÆÚ£º 10/26/2004

Carl Ganz, Jr.

Äú¿ÉÒÔʹÓÃÎÞÊýÖÖ·½·¨ÔÚ VB6 ºÍ VB.NET Öд¦ÀíÊý¾Ý¡£ÕâÁ½¸öƽ̨¶¼Ö§³ÖÖîÈçÊý×éºÍ¼¯ºÏÖ®ÀàµÄ½á¹¹£¬¿ª·¢ÈËԱͨ³£½«×Ô¶¨ÒåÀà°ü×°µ½ÕâЩ½á¹¹ÖУ¬¾ÍÈçÄúÔÚ Carl Ganz 2004 Äê 3 ÔµÄרÀ¸Öп´µ½µÄÄÇÑù¡£Êý¾Ý¶ÀÁ¢£¨Õâ¿ÉÄÜÊÇ´´½¨×Ô¶¨ÒåÊý¾Ý³éÏó²ãµÄ×î´óÓÅÊÆ£©ÔÊÐíÓû§ÔÚ¶ÀÁ¢ÓÚÊý¾Ý¿âµÄÇé¿öϲÙ×÷Êý¾Ý¡£Õâ²»½ö½µµÍÁË·þÎñÆ÷µÄ¸ºµ££¬»¹Ïû³ýÁËά»¤µ½¸ÃÊý¾Ý¿âµÄ¿ª·ÅÁ¬½ÓµÄÐèÒª£¬»òÊǶÔÍü¼Ç¸üРRDBMS µÄµ£ÐÄ¡£±¾Ô£¬Carl ½«·ÖÎöÈçºÎͬʱʹÓà ADO ºÍ ADO.NET À´´´½¨´ËÀàÊý¾Ý¶ÔÏó¡£

*

ÔÚ VB6 ÖУ¬OLE DB Óαê·þÎñÔÊÐíÄú´´½¨Í¨³£×÷ΪÐé¹¹µÄRecordset µÄÄÚÈÝ¡£ÕâЩֻÊÇ ADO Recordset ¶ÔÏóµÄÄÚ´æÖÐʵÀý£¬Field ¶ÔÏó½«Ìí¼Óµ½ÕâЩʵÀýÖÐÒÔÐγÉÒ»¸öÊý¾Ý½á¹¹¡£ÄúÐèÒªÏÔʽ´´½¨ÕâЩ Recordset ¿Í»§¶Ë£¬ÈçÇåµ¥ 1 ÖÐËùʾ£»Ä¬ÈÏÇé¿öÏ£¬ËüÃÇÊÇÔÚ·þÎñÆ÷¶Ë´´½¨µÄ£¬ÄúÔÚ·þÎñÆ÷Éϲ»ÄÜÓÐÀëÏß Recordset¡£

Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.CursorType = adStatic
oRS.LockType = adLockBatchOptimistic
'Add a few fields
With oRS.Fields
   .Append "LastName", adVarChar, 40, adFldIsNullable
   .Append "FirstName", adVarChar, 40, adFldIsNullable
   .Append "HireDate", adDate
End With
oRS.Open

Ò»µ©´´½¨ Recordset£¬Äú¾Í¿ÉÒÔÓÃÊý¾ÝÌî³äËüÁË¡£Çë×¢Ò⣬Field ¼¯ºÏµÄ Append ·½·¨Ö»ÄÜÓÃÓÚ¹Ø±ÕµÄ Recordset£»Èç¹ûÄúÔÚ´ò¿ª Recordset µÄ Fields ¼¯ºÏÉÏ»òÊÇÒÑÉèÖà ActiveConnection ÊôÐ﵀ Recordset Éϵ÷Óà Append£¬¾Í»áµ¼ÖÂÔËÐÐʱ´íÎó¡£Çåµ¥ 2 ²ûÊÍÁËÈçºÎ½«Êý¾ÝÌí¼Óµ½ Recordset ¶ÔÏó¡£

Çåµ¥ 2 ÖеÄ×îºóÁ½ÐдúÂë²ûÊÍÁËÈçºÎ´´½¨Ë÷Òý£¬ÒÔʹÅÅÐò¸ü¼Ó¸ßЧ¡££¨Í¨³££¬ÄúӦͨ¹ýÒ»¸öÌṩ³õʼÅÅÐòµÄ SQL ÃüÁîÀ´¼ÓÔØ´ËÀàÊý¾Ý£¬µ«ÊÇÈç¹ûÊý¾ÝÔÚÍø¸ñÖУ¬Äú¿ÉÄÜÏ£ÍûÔÊÐíÓû§Í¨¹ý£¨±ÈÈç˵£©µ¥»÷ÁбêÌâÀ´ÅÅÐòËü¡££©

Çåµ¥ 2. ÓÃÊý¾ÝÌî³ä Recordset ¶ÔÏó¡£

'Populate with some data
oRS.AddNew Array("LastName", "FirstName", "HireDate")_
   , Array("Washington", "George", "3/12/2003")
oRS.AddNew Array("LastName", "FirstName", "HireDate")_
   , Array("Adams", "John", "8/5/2003")
oRS.AddNew Array("LastName", "FirstName", "HireDate")_
   , Array("Jefferson", "Thomas", "4/27/2003")
oRS.Update
'Create an in-memory index
oRS.Fields("LastName").Properties("Optimize").Value _
   = True
 'Sort on first name
oRS.Sort = "FirstName"

´´½¨ Recordset µÄÁíÒ»ÖÖ·½·¨Éæ¼°µ½ÀëÏß Recordset¡£ÕâÖ»ÊÇÒ»¸ö Recordset ¶ÔÏó£¬ËüËæºó½«Á¬½Óµ½ÓÉÓÚ½« ActiveConnection ÊôÐÔÉèÖÃΪ Nothing ¶øÀëÏߵķþÎñÆ÷£¨Çë²Î¼ûÇåµ¥ 3£©¡£

Çåµ¥ 3. ´´½¨ÀëÏß Recordset¡£

Dim objConnection As ADODB.Connection
Dim szSQL As String
Set objConnection = New ADODB.Connection
'Open a connection
objConnection.ConnectionString = "whatever"
objConnection.Open
'Instantiate a Recordset object...
Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.CursorType = adOpenStatic
oRS.LockType = adLockBatchOptimistic
'...and set the ActiveConnection property
Set oRS.ActiveConnection = objConnection
szSQL = "SELECT LastName, FirstName " & _
   "FROM Employees " & "ORDER BY LastName, FirstName"
'Open the Recordset and return the employee data
oRS.Open szSQL
Set oRS.ActiveConnection = Nothing
objConnection.Close
Set DataGrid1.DataSource = oRS

ʹÓà ADO.NET

ADO.NET ΪÀëÏßÊý¾Ý¹ÜÀíÌṩÁ˸üÇ¿´óµÄ¹¦ÄÜ¡£DataTable ºÍ DataSet ¶ÔÏó±¾Éí¾Í¶¨ÒåΪÀëÏߣ¬Òò´ËÄú²»±ØÖ´ÐÐÈκβÙ×÷À´Ê¹ËüÃÇÀëÏß¡£´Ó¸ÅÄîÉÏÀ´Ëµ£¬ADO.NET DataTable ¶ÔÏóºÍ ADO Recordset ¶ÔÏóµÄ±à³Ì´´½¨¹ý³Ì·Ç³£ÀàËÆ£¬ÈçÇåµ¥ 4 ÖÐËùʾ¡£ÔÚ±¾Ê¾ÀýÖУ¬ÎÒÃÇÒª´´½¨Ò»¸ö DataTable ¶ÔÏ󣬲¢ÏòÆäÌí¼ÓÁкÍÐжÔÏó¡£ÕýÈçÄú½«¿´µ½µÄÄÇÑù£¬ADO.NET µÄ·½·¨Ê¹ÓÃÁËÒ»¸ö±È»ùÓÚ COM µÄ ADO ËùʹÓõĸü¼Ó²ã´Î»¯µÄ¶ÔÏóÄ£ÐÍ¡£

Çåµ¥ 4. ´´½¨ ADO.NET DataTable ¶ÔÏó¡£

Dim oDataRow As DataRow
Dim oDataColumn As DataColumn
Dim aPrimaryKey(0) As DataColumn
oDS = New DataSet
'Create a new DataTable oect
oEmployeeDT = New DataTable
'Add an event handler for column data changes
AddHandler oEmployeeDT.ColumnChanged, _
   New DataColumnChangeEventHandler(AddressOf _
   ColumnChanged)
'Create primary key (PK) col and add it to the columns
'collection. Set init value to 1, increment as needed.
oDataColumn = New DataColumn
oDataColumn.ColumnName = "ID"
oDataColumn.DataType = _
   System.Type.GetType("System.Int32")
oDataColumn.AutoIncrement = True
oDataColumn.AutoIncrementSeed = 1
oEmployeeDT.Columns.Add (oDataColumn)
'PK property receives array of DataColumn objects in 
'case you have multi-col index. I prefer an ID column.
aPrimaryKey(0) = oDataColumn
oEmployeeDT.PrimaryKey = aPrimaryKey
'Create the individual data columns
…
oDataColumn = New DataColumn
oDataColumn.ColumnName = "Salary"
oDataColumn.DataType = _
   System.Type.GetType("System.Decimal")
oEmployeeDT.Columns.Add (oDataColumn)
'Here we use DataColumn's Expression property to show
'what a 28% tax on the salary will amount to.
oDataColumn = New DataColumn
oDataColumn.ColumnName = "IncomeTax"
oDataColumn.DataType = _
   System.Type.GetType("System.Decimal")
oDataColumn.Expression = "Salary * .28"
oEmployeeDT.Columns.Add (oDataColumn)
oDataColumn = New DataColumn
oDataColumn.ColumnName = "HireDate"
oDataColumn.DataType = _
   System.Type.GetType("System.DateTime")
oEmployeeDT.Columns.Add (oDataColumn)
'This col receives the value calc'd by event handler
oDataColumn = New DataColumn
oDataColumn.ColumnName = "DaysSinceHire"
oDataColumn.DataType = _
   System.Type.GetType("System.Int16")
oEmployeeDT.Columns.Add (oDataColumn)
'Once the columns are added, add sample data
oDataRow = oEmployeeDT.NewRow()
oDataRow("LastName") = "Washington"
oDataRow("FirstName") = "George"
oDataRow("Salary") = 45000
oDataRow("IncomeTax") = True
oDataRow("HireDate") = "4/12/1981"
oEmployeeDT.Rows.Add (oDataRow)
…
'Commit new data to the DataTable object and set
'RowState values of each row to Unchanged
oEmployeeDT.AcceptChanges()
'Let's show the user
DataGrid1.DataSource = oEmployeeDT

ÔÚʵÀý»¯ DataTable ¶ÔÏóÖ®ºó£¬Äú¾Í¿ÉÒÔʹÓÃÕâ¸öʼþÄ£Ðͽ«Ê¼þ´¦Àí³ÌÐò¡°DataColumnChangeEventHandler¡±ÉèÖÃΪ×Ô¶¨ÒåÀý³Ì¡£Í¨¹ý´«µÝ ColumnChanged Àý³ÌµÄµØÖ·£¬Ö»ÒªÒ»¸öÁÐÖеÄÊý¾Ý¸ü¸Ä£¬Äú¾Í¿ÉÒÔÖ´ÐÐÕâ¸ö´¦Àí³ÌÐò¡£ÔÚ±¾ÀýÖУ¬ÎÒÃÇҪʹÓÃËüÀ´È·¶¨Ö°Ô±±»¹ÍÓ¶ÒÔÀ´µÄÌìÊý£¨Çë²Î¼ûÇåµ¥ 5£©¡£

Çåµ¥ 5. ColumnChanged ʼþ´¦Àí³ÌÐò¡£

Sub ColumnChanged(ByVal sender As Object, _
   ByVal e As DataColumnChangeEventArgs)
   If e.Column.ColumnName = "HireDate" Then
      e.Row("DaysSinceHire") = _
         DateDiff(DateInterval.Day, _
            e.Row("HireDate"), Date.Today)
   End If
End Sub

ÓÉÓÚÓû§ÔÚÍø¸ñÖб༭Êý¾Ý¡¢Ìí¼ÓºÍɾ³ýÐУ¬Òò´Ëÿ¸öÐжÔÏóµÄ RowState ÊôÐÔ»á¸ü¸Ä£¬ÒÔָʾËù×÷Ð޸ĵÄÀàÐÍ¡£µ±Óû§½«ÀëÏßÊý¾ÝÌá½»µ½ RDBMS ʱ£¬ÐèÒª¼ÆËãÿһÐÐÀ´È·¶¨Óû§Ö´ÐÐÁ˺ÎÖÖÀàÐ͵ĸü¸Ä¡£ÒªÍê³ÉÕâÒ»²Ù×÷£¬Äú¿ÉÒÔͨ¹ý GetChanges ·½·¨¼ìË÷°üº¬ËùÓÐнüÌí¼Ó¡¢Ð޸ĺÍɾ³ýµÄÐÐµÄ DataTable ¶ÔÏó¡£È»ºó£¬Ñ­»··ÃÎÊÕâ¸öРDataTable ÖеÄÿ¸öÐжÔÏó²¢¼ÆËã RowState ÊôÐÔ£¬ÈçÇåµ¥ 6 ÖÐËùʾ¡£

Çåµ¥ 6. ±êʶ¸ü¸ÄµÄÐв¢±£´æ¸ü¸Ä¡£

Dim oDataRow As DataRow
Dim oChangeDT As DataTable
'Get DataTable with only changed rows
oChangeDT = oEmployeeDT.GetChanges()
'Save button s/b disabled until a change is made
If oChangeDT Is Nothing Then
   Exit Sub
End If
'Loop thru changed rows, make db updates
For Each oDataRow In oChangeDT.Rows
   Select Case oDataRow.RowState
      Case DataRowState.Added
         'Insert code here
      Case DataRowState.Modified
         'Update code here
      Case DataRowState.Deleted
         'Delete code here
   End Select
Next
oChangeDT.Dispose()
oChangeDT = Nothing
oDataRow = Nothing
'Issue AcceptChanges method to reset RowState values
oEmployeeDT.AcceptChanges()

¼Ù¶¨ÎÒÃÇÐèÒª£¨±ÈÈç˵£©ÒÔÒ»¶Ô¶à (1:M) µÄ¹ØÏµÊ¹Óöà¸ö±í¡£ÒòΪÊý¾ÝÊÇÏà¹ØµÄ£¬ËùÒÔÎÒÃÇ¿ÉÒÔÔÚÒ»¸öµ¥¶ÀµÄ DataTable ÖйÜÀí¸ÃÐÅÏ¢£¬²¢ÔÚ DataSet ¶ÔÏóµÄ±£»¤ÏÂά»¤Á½¸ö DataTable Ö®¼äµÄ¹ØÏµ¡£ÔÚÒÔÏÂʾÀýÖУ¬ÎÒÃǽ«ÎªÃ¿¸öÖ°Ô±Ö¸¶¨¶àÖÖнˮ£¬²¢ÔÚÏà¹ØµÄÍø¸ñ¿Ø¼þÖв鿴ËüÃÇ¡£Í¨¹ýʹÓà DataRelation ¶ÔÏó£¬ÎÒÃÇ¿ÉÒÔÔÚÁ½¸öÊý¾Ý¼¯Ö®¼ä´´½¨Ò»¸öÄÚ´æÖйØÏµ£¬²¢½« Employee ±íµÄ ID ÁÐÓÃ×÷Ö÷¼ü (PK)£¬¶ø½« Paycheck ±íµÄ EmployeeID ÁÐÓÃ×÷Íâ¼ü (FK)¡£ÒýÓÃÍêÕûÐÔ (RI) Ô­Ôò¸æËßÎÒÃÇ£¬µ±Ò»¸öÖ°Ô±¼Ç¼±»É¾³ýʱ£¬ËùÓйØÁªµÄнˮÊý¾ÝÒ²±ØÐ뱻ɾ³ý¡£ÎªÁËʵʩÕâ¸ö¹æÔò£¬ÎÒÃÇ¿ÉÒÔÉèÖÃÒ»¸ö ForeignKeyConstraint ¶ÔÏó£¨Çë²Î¼ûÇåµ¥ 7£©¡£

Çåµ¥ 7. ÉèÖÃÊý¾Ý¹ØÏµ¡£

Dim oDataRelation As DataRelation
Dim oParentColumn As DataColumn
Dim oChildColumn As DataColumn
Dim oForeignKeyConstraint As ForeignKeyConstraint
GetPaychecks()
'Manage both tables from within a DataSet object
oDS.Tables.Add (oEmployeeDT)
oDS.Tables.Add (oPayCheckDT)
'Retrieve PK, FK from the employee, paycheck tables
oParentColumn = oEmployeeDT.Columns("ID")
oChildColumn = oPayCheckDT.Columns("EmployeeID")
'Create DataRelation object to maintain relationship
oDataRelation = New DataRelation("EmployeePaycheck", _
   oParentColumn, oChildColumn)
oDS.Relations.Add (oDataRelation)
'Create ForeignKeyConstraint obj. to enforce delete 
oForeignKeyConstraint = New _
   ForeignKeyConstraint(oParentColumn, oChildColumn)
oForeignKeyConstraint.DeleteRule = Rule.Cascade

ʵ¼ÊÉÏ£¬±¾ÎÄÖ»ÊÇ´ÖdzµØÌ½ÌÖÁËÄúÔÚ VB6 ºÍ .NET ÖÐʹÓÃÀëÏßÊý¾Ý¿ÉÒÔʵÏֵIJÙ×÷¡£ÓÉÓÚ Microsoft µÄÊý¾Ý·ÃÎʼ¼ÊõÕýÇ÷ÏòÓڹ㷺ʹÓÃÀëÏßÊý¾Ý£¬Òò´ËÁ˽âÈçºÎʹÓÃÀëÏßÊý¾Ý¶ÔÄúδÀ´µÄ¿ª·¢¹¤×÷ÊÇÖÁ¹ØÖØÒªµÄ¡£

ÏÂÔØ 408CARL1.ZIP

ÓÐ¹Ø Hardcore Visual Basic ºÍ Pinnacle Publishing µÄÏêϸÐÅÏ¢£¬Çë·ÃÎÊÆäÍøÕ¾ http://www.pinpub.com/

×¢£ºÕâ²»ÊÇ Microsoft Corporation µÄÍøÕ¾¡£Microsoft ¶Ô¸ÃÍøÕ¾µÄÄÚÈݲ»³Ðµ£ÔðÈΡ£

±¾ÎÄÊÇ´Ó Hardcore Visual Basic 2004 Äê 8 ÔºÅ×ªÔØµÄ¡£°æÈ¨ËùÓÐ 2004£¬Pinnacle Publishing, Inc.£¨³ý·ÇÁíÐÐ˵Ã÷£©¡£±£ÁôËùÓÐȨÀû¡£Hardcore Visual Basic ÊÇ Pinnacle Publishing, Inc. ¶ÀÁ¢·¢ÐеIJúÆ·¡£Î´¾­ Pinnacle Publishing, Inc. ÊÂÏÈͬÒ⣬²»µÃÒÔÈκÎÐÎʽʹÓûò¸´ÖƱ¾ÎĵÄÈκβ¿·Ö£¨ÆÀÂÛÎÄÕÂÖеļò¶ÌÒýÓóýÍ⣩¡£ÒªÁªÏµ Pinnacle Publishing, Inc.£¬ÇëÖµç 1-800-788-1900¡£

תµ½Ô­Ó¢ÎÄÒ³Ãæ


·µ»ØÒ³Ê×·µ»ØÒ³Ê×