Introduction to ADO.NET Programming. ADO.NET Objects Data Set.NET Applications Data Reader Command...
-
date post
20-Dec-2015 -
Category
Documents
-
view
236 -
download
1
Transcript of Introduction to ADO.NET Programming. ADO.NET Objects Data Set.NET Applications Data Reader Command...
ADO.NET Objects
Data Set
.NET Applications
Data Reader
Command Object
Connection Object
Managed Data Provider(OLEDB)
Database
Adapter
Connection with a Connection Object
• A connection object represents a unique session with a data source.
• Connection string: database, OLE DB provider, password, if any, security, etc.
• Use the Open/Close method to open/close a connection.
• Other functions: – Manage transaction: BeginTransaction(), Commit,
rollBack.
Connection String
• Containing information about database, OLE DB provider, password, if any, security, etc.
• For Jet database:– ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
Data Link Properties (Under the Advanced Tab of the Connection Dialog Window)
• Access permissions – Read—Read only.– ReadWrite—Read and write.– Share Deny None—Neither read nor write access can
be denied to others.– Share Deny Read—Prevents others from opening in
read mode.– Share Deny Write—Prevents others from opening in
write mode.– Share Exclusive—Prevents others from opening in
read/write mode. – Write—Write only.
Providers
• MSDASQL – Microsoft OLE DB Provider for ODBC
• Microsoft.Jet.OLEDB.3.51
• Microsoft.Jet.OLEDB.4.0
• MSDAORA – For Oracle
• SQLOLEDB – Microsoft SQL Server
Connection Object
• Example:– dim strConn as string ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\
sales2k.mdb"
– dim objConn as new OledbConnection(strConn)
– objConn.open()
• Basic Methods:– Open, Close
– BeginTransaction
Command Object• The command object allows us to execute a SQL
statement.• Properties:
– CommandType: SQL or stored procedure– CommandText: SQL statement– Connection– Other properties:
• Parameters
• Basic Methods:– ExecuteReader: Creates a DataReader object that contains
the results of the query.– ExecuteNonQuery: Change the data in a database without
using a DataSet by executing SQL’s UPDATE, INSERT, or DELETE statements.
ExecuteReader Example
dim strConn as string ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
dim objConn as new OledbConnection(strConn)
dim strSQL as string = "select * from customer;"
dim objComm as new OledbCommand(strSQL,objConn)
dim Results as string
objConn.open()
dim objDataReader as oledbDataReader
objDataReader=objComm.executeReader()
Import NameSpace
• The Imports statement must appear before all other declarations in a file and cannot appear inside a class or module declaration.– Imports System.Data.OleDb– Public Class Form1
DataReader Object
• It is read-only and forward-only cursor.
• Basic Methods:– Read: Reads the current record and advances
the pointer to the next record. It returns False if no more record in the DataReader.
– Close: Closes the dataReader.
Read Records in a DataReader
• dim Results as string• do while objDataReader.Read()=true
Results+=objDataReader("cid") + “ “ + objDataReader("Cname") + vbCrLF
• loop• Textbox1.text=Results
• Note: objDataReader.Item(0)• Note: objDataReader.Item(“cid”)
Add Items from a DataReader to a Listbox
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
Dim objConn As New OleDbConnection(strConn)
Dim strSQL As String = "select cname from customer;"
Dim objComm As New OleDbCommand(strSQL, objConn)
objConn.Open()
Dim objDataReader As OleDbDataReader
objDataReader = objComm.ExecuteReader()
Do While objDataReader.Read() = True
LISTBOX1.Items.Add(objDataReader("cname"))
Loop
Note1: Listbox is not bound. 2. SelectedItem
Note2: With the data binding you cannot issue the Add method.
Use a DataReader to Retrieve SummariesDim sfCount, laCount, aCount, bCount, cCOunt As Integer objConn.Open() Dim objDataReader As OleDbDataReader objDataReader = objComm.ExecuteReader() Do While objDataReader.Read() = True If objDataReader("city") = "sf" Then sfCount += 1 ElseIf objDataReader("city") = "la" Then laCount += 1 End If If objDataReader("rating") = "a" Then aCount += 1 ElseIf objDataReader("rating") = "b" Then bCount += 1 Else cCOunt += 1 End If Loop TextBox1.Text = sfCount.ToString TextBox2.Text = laCount.ToString TextBox3.Text = aCount.ToString TextBox4.Text = bCount.ToString TextBox5.Text = cCOunt.ToString
Use SQL to Retrieve Summaries
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
Dim objConn As New OleDbConnection(strConn)
Dim strSQL As String = "select count(cid) as custCount from customer;"
Dim objComm As New OleDbCommand(strSQL, objConn)
Dim Results As String
objConn.Open()
Dim objDataReader As OleDbDataReader
objDataReader = objComm.ExecuteReader()
If objDataReader.Read = True Then
MessageBox.Show(objDataReader("custCount").ToString)
End If
Testing for Null
If objDataReader.Read = True Then
If IsDBNull(objDataReader("custCount")) Then
TextBox1.Text = 0
Else
TextBox1.Text = objDataReader("custCount").ToString
End If
End If
Error HandlingTry
objConn.Open()
Dim objDataReader As OleDbDataReader
objDataReader = objComm.ExecuteReader()
Do While objDataReader.Read() = True
Results += objDataReader("cid") + " " + objDataReader("Cname") + vbCrLf
Loop
TextBox1.Text = Results
objConn.Close()
Catch except As System.Exception
MessageBox.Show(except.Message)
End Try
Possible Database Errors
• SQL syntax errors
• Database connection not open
• Violate database constraints• Referential integrity
• Field data type and length
• Primary key constraint
ExecuteNonQuery Example
dim strSQLUpd as string="Update customer set rating = ‘A’”
strSQLUpd=strSQLUpd & " where cname='" & CnameList.selectedItem.text & "'“Dim objCommUpd As New OleDbCommand(strSQLUpd, objConn)
objCommUpd.ExecuteNonQuery()
Note: How many records affected by this command?
Messagebox.Show(objCommUpd.ExecuteNonQuery())
Demo
• Create a project that do the following tasks:– Use a DataReader to retrieve customer IDs and
populate a listbox.– Select a new rating from radio buttons for the
selected customer.– Update customer’s rating using the
ExecuteNonQuery method of a Command object.
Declare OleDB objects and create listboxImports System.Data.OleDb
Public Class Form3
Inherits System.Windows.Forms.Form
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
Dim objConn As New OleDbConnection(strConn)
Dim strSQL As String = "select cid from customer;"
Dim objComm As New OleDbCommand(strSQL, objConn)
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
objConn.Open()
Dim objDataReader As OleDbDataReader
objDataReader = objComm.ExecuteReader()
Do While objDataReader.Read() = True
ListBox1.Items.Add(objDataReader("cid"))
Loop
objConn.Close()
End Sub
Update customer ratingPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
objConn.Open()
Dim newRating As String
If RadioButton1.Checked = True Then
newRating = "A"
ElseIf RadioButton2.Checked Then
newRating = "B"
Else
newRating = "C"
End If
Dim strSQLUpd As String = "Update customer set rating = '" & newRating & "'"
strSQLUpd = strSQLUpd & " where cid='" & ListBox1.SelectedItem & "'"
Dim objCommUpd As New OleDbCommand(strSQLUpd, objConn)
objCommUpd.ExecuteNonQuery()
objConn.Close()
End Sub
Use Command Object’s ExecuteNonQuery to Insert A New Record
1. Create unbound text boxes to enter new record.
2. Add an Insert button with the following handler
Dim strSQLInsert As String
strSQLInsert = "Insert into Customer values ('"
strSQLInsert = strSQLInsert & TextBox1.Text & "','" & TextBox2.Text & "','"
strSQLInsert = strSQLInsert & TextBox3.Text & "','" & TextBox4.Text & "')"
Dim objCommInsert As New OleDbCommand(strSQLInsert, objConn)
objCommInsert.ExecuteNonQuery()
DataSet Object
• A DataSet object can hold several tables and relationships between tables.
• A DataSet is a set of disconnedted data. Data is extracted from the database and stored in the DataSet object. Updates to the DataSet must copy back to the database to make the changes permanent.
DataSet and Related Objects• DataSet: Can contain multiple tables and
relationships.• DataTable object: Represents a table in the
dataset.• DataAdapter: This the object used to pass data
between the database and the dataset. The Fill method copies the data into the dataset, and the Update method copies the updates back into the database.
• DataView: This represents a specific view of the DataTables held in the dataset.
Structure of a Dataset
Dataset
Tables
Data table
Rows
Data Row
Columns
Data Column
Constraints
ConstraintRelations
Data Relation
Reading Data into a Table
• dim strConn as string ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
• dim objConn as new OledbConnection(strConn)
• dim strSQL as string = "select * from customer;"
• dim objDataSet as new Dataset()
• dim objAdapter as new OledbDataAdapter(strSQL, objConn)
• objAdapter.Fill(objDataSet, "Cust")
Binding a Table in a Dataset to a DataGridImports System.Data.OleDb
Public Class Form4
Inherits System.Windows.Forms.Form
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
Dim objConn As New OleDbConnection(strConn)
Dim objDataSet As New DataSet()
Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim strSQL As String = "select * from customer;"
Dim objAdapter As New OleDbDataAdapter(strSQL, objConn)
objAdapter.Fill(objDataSet, "Cust")
DataGrid1.DataSource = objDataSet
DataGrid1.DataMember = "Cust"
End Sub
Note: Adapter’s Fill method is able to open the connection.
DataView ObjectA Better Way for Binding
• The DataView object exposes a complete table or a subset of the records from a table.
• Table’s DefaultView property:– Dim ObjDataView As New DataView()– ObjDataView.Table = objDataSet.Tables("Cust")– Or: ObjDataView = objDataSet.Tables("Cust").DefaultView
• DataView can be used as a DataSource in data binding.
Data Binding with DataView Object
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
Dim objConn As New OleDbConnection(strConn)
Dim objDataSet As New DataSet()
Dim strSQL As String = "select * from customer;"
Dim objAdapter As New OleDbDataAdapter(strSQL, objConn)
objAdapter.Fill(objDataSet, "Cust")
Dim ObjDataView As New DataView()
ObjDataView = objDataSet.Tables("Cust").DefaultView
DataGrid1.DataSource = ObjDataView
Selecting a Subset of Records with DataView’s RowFilter Property
• objDataView.RowFilter = criteria
• Note: The criteria can be a simple or complex condition.
DataView ExampleDim ObjDataView As New DataView()
Dim newRating As String
If RadioButton1.Checked = True Then
newRating = "A"
ElseIf RadioButton2.Checked Then
newRating = "B"
Else
newRating = "C"
End If
ObjDataView.Table = objDataSet.Tables("Cust")
ObjDataView.RowFilter = "rating='" & newRating & "'"
DataGrid1.Visible = True
DataGrid1.DataSource = ObjDataView
Accessing Records in DataView
Using DataView and DataRowView object’s Item property:
objdataView = objDataSet.Tables("customer").DefaultView
TextBox1.Text = objdataView.Item(rowIndex).Item(0)
TextBox2.Text = objdataView.Item(rowIndex).Item(1)
Move to the next record:
rowIndex += 1
TextBox1.Text = objdataView.Item(rowIndex).Item(0)
TextBox2.Text = objdataView.Item(rowIndex).Item(1)
Note: To avoid out-of-bound, use the DataView’s Count property.
Defining an Adapter without A Command Object
• dim strConn as string ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
• dim objConn as new OledbConnection(strConn)• dim strSQL as string = "select * from
customer;"• dim objDataSet as new Dataset()• dim objAdapter as new OledbDataAdapter(strSQL,
objConn)• objAdapter.Fill(objDataSet, "Cust")
Defining an Adapter with A Command Object
• dim strSQLCust as string = "select * from customer;"
• dim objComm as new OledbCommand()
• dim objAdapter as new OledbDataAdapter()
• dim objDataSet as new Dataset()
• objComm.Connection=objConn
• objComm.CommandType=COmmandType.Text
• objComm.CommandText=strSQLCust
• objAdapter.SelectCommand=objComm
• objConn.open()
• objAdapter.Fill(objDataSet, "Customer")
• Note:Adapter has SelectCommand, InsertCommand, DeleteCommand, UpdateCommand properties (Check Object Browser).
Creating Multiple Tables in A DataSet with One Adapter
• dim strSQLCust as string = "select * from customer;"
• dim strSQLOrder as string ="select * from orders;"
• dim objComm as new OledbCommand()• dim objAdapter as new OledbDataAdapter()• dim objDataSet as new Dataset()• objComm.Connection=objConn• objComm.CommandType=COmmandType.Text• objComm.CommandText=strSQLCust• objAdapter.SelectCommand=objComm• objConn.open()• objAdapter.Fill(objDataSet, "Customer")• objComm.COmmandText=strSQLOrder• objAdapter.Fill(objDataSet, "Orders")
Binding Multiple Tables to a DataGrid (Example 2)
Dim ObjDataView As New DataView()
Dim TableName As String
If RadioButton1.Checked = True Then
ObjDataView = objDataSet.Tables("Customer").DefaultView
Else
ObjDataView = objDataSet.Tables("Orders").DefaultView
End If
DataGrid1.DataSource = ObjDataView
Adding Relationship to a Dataset
• The Dataset object has a Relations property. It is a collection of DataRelations. We can use a relationship to enforce the referential integrity.
• To define a DataRelation:– DataRelObj=DataRelation(RelationName, ParentTable
Field, ChildTableField)• Dim objRel As DataRelation
• objRel = New DataRelation("custOrder", objDataset.tables("customer").columns("cid"), objDataset.tables("orders").columns("cid"))
• Adding a relation to the dataset:– objDataSet.Relations.Add(objRel)
Creating a Hierarchical DataGrid
Dim objRel As DataRelation
objRel = New DataRelation("custOrder", objDataSet.Tables("customer").Columns("cid"), objDataSet.Tables("orders").Columns("cid"))
objDataSet.Relations.Add(objRel)
DataGrid1.DataSource = objDataSet.Tables("customer")
DataTable’s Rows Property
• This is a collection of all the records in a table, a collection of DataRow objects.
• DataRow object’s properties and methods.
Accessing a Record with Index
objAdapter.Fill(objDataSet, "Customer")
TextBox1.Text = objDataSet.Tables("Customer").Rows(rowIndex).Item(0)
TextBox2.Text = objDataSet.Tables("Customer").Rows(rowIndex).Item(1)
Access Rows in a DataRow Collection
• dim objTable as DataTable = objDataset.Tables("Customer")
• dim objRow as DataRow• For each objRow in objTable.Rows• strResult=strResult+“ " & objRow("cid") &
" " & objRow("cname") & vbCrLf
• Next
DataRow object’s GetChildRows Method
• Returns a collection of rows from another table that are related as child rows to this row.
Displaying Parent/Child Records in a Relation
• Define the relation.
• Specify the relation in the GetChildRows method of the DataRow object.
Imports System.Data.OleDb
Public Class Form1
Inherits System.Windows.Forms.Form
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
Dim objConn As New OledbConnection(strConn)
Dim strSQLCust As String = "select * from customer;"
Dim strSQLOrder As String = "select * from orders;"
Dim objComm As New OledbCommand()
Dim objAdapter As New OledbDataAdapter()
Dim objDataSet As New DataSet()
Dim objRel As DataRelation
Dim strResult As String
Dim rowIndex As Integer = 0
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
objComm.Connection = objConn
objComm.CommandType = CommandType.Text
objComm.CommandText = strSQLCust
objAdapter.SelectCommand = objComm
objConn.Open()
objAdapter.Fill(objDataSet, "Customer")
objComm.CommandText = strSQLOrder
objAdapter.Fill(objDataSet, "Orders")
objRel = New DataRelation("custOrder", objDataSet.Tables("Customer").Columns("cid"), objDataSet.Tables("Orders").Columns("cid"))
objDataSet.Relations.Add(objRel)
Call showChild(rowIndex)
End Sub
Private Sub showChild(ByVal RowIndex)
TextBox1.Text = objDataSet.Tables("customer").Rows(RowIndex).Item("cid")
TextBox2.Text = objDataSet.Tables("customer").Rows(RowIndex).Item("cname")
Dim objOrderRel As DataRelation = objDataSet.Tables("customer").ChildRelations("custOrder")
Dim strResult As String
Dim objChildRow As DataRow
For Each objChildRow In objDataSet.Tables("customer").Rows(RowIndex).GetChildRows(objOrderRel)
strResult = strResult + objChildRow("oid") + " " + objChildRow("odate") + vbCrLf
Next
TextBox3.Text = strResult
End Sub
****Note****: How to prevent EOF error?
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
rowIndex += 1
Call showChild(rowIndex)
End Sub
Display Child Records in Grid
• This technique uses the fact that the DataView of a table can be used as a DataSource in binding a data grid.
• Assuming a Customer/Orders relationship, for each customer record:– Use Table object’s Clone method to create a temporary
child table structure.– Use Table object’s ImportRow method to import child
records to the clone table.– Use the clone table’s DefaultView to bind the DataGrid.
Dim objRow As DataRow
Dim drFound As DataRow
drFound = objDataSet.Tables("Customer").Rows("0")
TextBox1.Text = drFound.Item("cid")
TextBox2.Text = drFound.Item("cname")
Dim childTable As DataTable
childTable = objDataSet.Tables("orders").Clone
For Each objRow In drFound.GetChildRows(objOrderRel)
childTable.ImportRow(objRow)
Next
DataGrid1.DataSource = childTable.DefaultView
Binding a ListBox with CodePrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb"
Dim objConn As New OleDbConnection(strConn)
Dim strSQL As String = "select * from customer;"
Dim objDataSet As New DataSet()
Dim objAdapter As New OleDbDataAdapter(strSQL, objConn)
objAdapter.Fill(objDataSet, "Customer")
ListBox1.DataSource = objDataSet.Tables("Customer")
ListBox1.DisplayMember = "CID"
End Sub
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
TextBox1.Text = ListBox1.SelectedItem.item("cname")
End Sub
Note: The FieldName for the DisplayMember is case-sensitive and should match the field name in the database.
Creating Parameter Queries
• 1. Specify the parameters in the SQL statement.– Dim strSQLOrder As String = "select * from orders where cid= ?;"
• 2. Add the parameters to the Command Object’s Parameters collection.– objComm.Parameters.Add("?cid", OleDbType.VarChar)
• 3. Assign the command to Adapter’s SelectCommand – objAdapter.SelectCommand=objComm
• 4. Set parameter’s value.– objAdapter.SelectCommand.Parameters("?cid").Value =
ListBox1.SelectedItem.item("cid")
Parameter Query Example TextBox1.Text = ListBox1.SelectedItem.item("cname") Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb" Dim objConn As New OleDbConnection(strConn) objConn.Open() Dim strSQLOrder As String = "select * from orders where cid= ?;" Dim objComm As New OleDbCommand() Dim objAdapter As New OleDbDataAdapter() Dim objDataSet As New DataSet() objComm.Connection = objConn objComm.CommandType = CommandType.Text objComm.CommandText = strSQLOrder objComm.Parameters.Add("?cid", OleDbType.VarChar) objAdapter.SelectCommand = objComm objAdapter.SelectCommand.Parameters("?cid").Value = ListBox1.SelectedItem.item("cid") objAdapter.Fill(objDataSet, "Orders") DataGrid1.DataSource = objDataSet DataGrid1.DataMember = "orders"
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim strSQLOrder As String = "select * from customer where city= ?;" Dim objComm As New OleDbCommand() Dim objDataSet As New DataSet() objComm.Connection = objConn objComm.CommandType = CommandType.Text objComm.CommandText = strSQLOrder objComm.Parameters.Add("?city", OleDbType.VarChar) objAdapter.SelectCommand = objComm End Sub Private Sub RadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged Dim ObjDataView As New DataView() Dim city As String If RadioButton1.Checked = True Then city = "sf" ElseIf RadioButton2.Checked Then city = "la" Else city = "new york" End If objAdapter.SelectCommand.Parameters("?city").Value = city objDataSet.Clear() objAdapter.Fill(objDataSet, "cust") DataGrid1.DataSource = objDataSet DataGrid1.DataMember = "cust" End Sub
• Can we use child table’s view to display child records in a grid?
– Use View’s FilterDim ObjDataView As New DataView()
ObjDataView.Table = objDataSet.Tables(“Orders")
ObjDataView.RowFilter = “cid='" & ListBox1.SelectedItem.item("cid") & "'"
DataGrid1.DataSource = ObjDataView
Multiple Forms: Where to import the oledb, and where to create the oledb objects
Imports System.Data.OleDbModule Module1 Public strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\sales2k.mdb" Public objConn As New OleDbConnection(strConn) Public strSQLCust As String = "select * from customer;" Public strSQLOrder As String = "select * from orders;" Public objComm As New OleDbCommand() Public objAdapter As New OleDbDataAdapter() Public objDataSet As New DataSet() Public objRel As DataRelation Public strResult As String Public rowIndex As Integer = 0 Public ObjDataView As New DataView() Public Sub main() objComm.Connection = objConn objComm.CommandType = CommandType.Text objComm.CommandText = strSQLCust objAdapter.SelectCommand = objComm objConn.Open() objAdapter.Fill(objDataSet, "Customer") objComm.CommandText = strSQLOrder objAdapter.Fill(objDataSet, "Orders") End SubEnd Module
Using ToolBox/Data to Define Ado.Net Objects
• Connection: ToolBox/Data/OledbConnection– ConnectionString
• Command: ToolBox/Data/OledbCommand– Connection– CommandType– CommandText