accessing data with microsoft visual c# applications

38
Accessing Data with Accessing Data with Microsoft Visual C# Microsoft Visual C# Applications Applications

Upload: lindsay-joseph

Post on 18-Jan-2016

252 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Accessing Data with Microsoft Visual C# Applications

Accessing Data with Accessing Data with Microsoft Visual C# Microsoft Visual C# ApplicationsApplications

Page 2: Accessing Data with Microsoft Visual C# Applications

2

AgendaAgenda

Quick overview of Microsoft® Visual C#™ Quick overview of Microsoft® Visual C#™ winform applicationwinform application

Data access with .NET data providers Data access with .NET data providers (3 scenarios):(3 scenarios): SQLClient data providerSQLClient data provider OleDb data providerOleDb data provider Using SQLDataAdapterUsing SQLDataAdapter

Data population with ADO .NET (4 scenarios):Data population with ADO .NET (4 scenarios): Retrieve data with DataSetRetrieve data with DataSet Read XML dataRead XML data Filter data in the DataSetFilter data in the DataSet Working with relationsWorking with relations

Page 3: Accessing Data with Microsoft Visual C# Applications

3

Agenda (2)Agenda (2)

Updating Data in ADO .NET (3 scenarios):Updating Data in ADO .NET (3 scenarios): Update using DataSetUpdate using DataSet Handling update errorsHandling update errors Update using database transactionsUpdate using database transactions

Connection pooling (1 scenario)Connection pooling (1 scenario) Using ADO Recordset in ADO .NET Using ADO Recordset in ADO .NET

(1 scenario)(1 scenario) Exception handling Exception handling

Page 4: Accessing Data with Microsoft Visual C# Applications

4

Typical C# Windows ApplicationTypical C# Windows Application11 using System; using System;22 using System.Windows.Forms; using System.Windows.Forms;33 using System.Data; using System.Data;44 using System.Data.SqlClient; using System.Data.SqlClient;

55 namespace YourAppName namespace YourAppName {{66 public class Form1 : System.Windows.Forms.Formpublic class Form1 : System.Windows.Forms.Form

{{77 private System.Windows.Forms.Button button1;private System.Windows.Forms.Button button1;88 private System.ComponentModel.Container components = null;private System.ComponentModel.Container components = null;

99 public Form1() ...public Form1() ...1010 protected override void Dispose( bool disposing )...protected override void Dispose( bool disposing )...

Windows Form Designer generated codeWindows Form Designer generated code1111 static void Main() static void Main()

{{1212 Application.Run(new Form1());Application.Run(new Form1());

}}1313 private void button1_Click(object sender, System.EventArgs ev)private void button1_Click(object sender, System.EventArgs ev)

{{1414 // Access your Data here // Access your Data here

}}}}

}}

Page 5: Accessing Data with Microsoft Visual C# Applications

5

Scenario 1Scenario 1SQLClient Data ProviderSQLClient Data Provider

Demonstrates the use of SQLClient data Demonstrates the use of SQLClient data provider to insert a record into a tableprovider to insert a record into a table

SqlConnection

SqlCommand Insert Query

1

2SQL Database

Page 6: Accessing Data with Microsoft Visual C# Applications

6

Scenario 1 Scenario 1 – con’t– con’t SQLClient Data ProviderSQLClient Data Provider

1 1 SqlConnection myCn = new SqlConnection myCn = new SqlConnection("server=srv;uid=;pwd=;database=northwind");SqlConnection("server=srv;uid=;pwd=;database=northwind");

2 2 SqlCommand myCmd = new SqlCommand("INSERT INTO SqlCommand myCmd = new SqlCommand("INSERT INTO Customers(CustomerID, CompanyName) Values ('ABC','ABC Customers(CustomerID, CompanyName) Values ('ABC','ABC Company')", myCn);Company')", myCn);

33 try { try {44 myCn.Open(); myCn.Open();55 myCmd.ExecuteNonQuery(); // insert the record myCmd.ExecuteNonQuery(); // insert the record }}66 catch(Exception e) { catch(Exception e) {77 Console.Write("Couldn't insert record: " + e.ToString()); Console.Write("Couldn't insert record: " + e.ToString()); }}88 finally { finally {99 myCn.Close(); myCn.Close(); // Close the connection explicitly// Close the connection explicitly }}

Page 7: Accessing Data with Microsoft Visual C# Applications

7

Scenario 2Scenario 2OleDb Data ProviderOleDb Data Provider

Demonstrates the use of OleDb data provider Demonstrates the use of OleDb data provider to execute a stored procedure that returns to execute a stored procedure that returns output parametersoutput parameters

OleDbConnection

OleDbCommand

1

create stored proc

OleDbParameter(Out)

3

2SQL

Database

Page 8: Accessing Data with Microsoft Visual C# Applications

8

Scenario 2Scenario 2 – con’t– con’t OleDb Data ProviderOleDb Data Provider

11 OleDbConnection myCn = new OleDbConnection("Provider= OleDbConnection myCn = new OleDbConnection("Provider= SQLOLEDB; server=srv;uid=;pwd=;database=northwind“);SQLOLEDB; server=srv;uid=;pwd=;database=northwind“);

22 OleDbCommand procCmd = new OleDbCommand(“CREATE OleDbCommand procCmd = new OleDbCommand(“CREATE PROCEDURE GetCoName @CustID nchar(5),@CoName PROCEDURE GetCoName @CustID nchar(5),@CoName

nchar(40) out as select @CoName = CompanyName from nchar(40) out as select @CoName = CompanyName from Customers where CustomerID = @CustID", myCn);Customers where CustomerID = @CustID", myCn);

33 myCn.Open(); myCn.Open();44 procCmd.ExecuteNonQuery(); procCmd.ExecuteNonQuery(); 55 OleDbCommand myCmd = new OleDbCommand("GetCoName", OleDbCommand myCmd = new OleDbCommand("GetCoName",

myCn);myCn);66 myCmd.CommandType = CommandType.StoredProcedure; myCmd.CommandType = CommandType.StoredProcedure;77 OleDbParameter myParam = null; OleDbParameter myParam = null;88 myParam = myCmd.Parameters.Add("@CustID", myParam = myCmd.Parameters.Add("@CustID",

OleDbType.VarWChar, 5);OleDbType.VarWChar, 5);99 myParam = myCmd.Parameters.Add("@CoName", myParam = myCmd.Parameters.Add("@CoName",

OleDbType.VarWChar, OleDbType.VarWChar, 40);40);

1010 myParam.Direction = ParameterDirection.Output; myParam.Direction = ParameterDirection.Output;1111 myCmd.Parameters["@CustID"].Value = "ABCD"; myCmd.Parameters["@CustID"].Value = "ABCD";1212 myCmd.ExecuteNonQuery(); myCmd.ExecuteNonQuery();

Page 9: Accessing Data with Microsoft Visual C# Applications

9

Scenario 3Scenario 3Using SqlDataReaderUsing SqlDataReader

Execute the CommandText against a Execute the CommandText against a SqlConnection and build the DataReader SqlConnection and build the DataReader objectobject

SqlConnection

SqlCommand

ExecuteReader() SqlDataReader

1

2

SQL Database

Page 10: Accessing Data with Microsoft Visual C# Applications

10

Scenario 3 Scenario 3 – con’t– con’t Using SqlDataReaderUsing SqlDataReader

11 SqlDataReader myReader = null; SqlDataReader myReader = null;22 SqlConnection myCn = new SqlConnection(ConStr); SqlConnection myCn = new SqlConnection(ConStr);33 SqlCommand myCmd = new SqlCommand("select * from stores", myCn); SqlCommand myCmd = new SqlCommand("select * from stores", myCn); try {try {44 myCn.Open(); myCn.Open();55 myReader = myCmd.ExecuteReader myReader = myCmd.ExecuteReader

(CommandBehavior.CloseConnection);(CommandBehavior.CloseConnection);66 while (myReader.Read()) { while (myReader.Read()) {77 Console.WriteLine(myReader[“StoreLocation"].ToString());Console.WriteLine(myReader[“StoreLocation"].ToString());

}} }}99 catch(Exception e) { catch(Exception e) {1010 Console.WriteLine(e.ToString()); Console.WriteLine(e.ToString()); }} finally {finally {1111 if (myReader != null) if (myReader != null)1212 myReader.Close(); myReader.Close(); }}

Page 11: Accessing Data with Microsoft Visual C# Applications

11

Scenario 4Scenario 4Retrieve Data with DataSetRetrieve Data with DataSet

Demonstrates the use of DataAdapter and Demonstrates the use of DataAdapter and DataSet to get data from a SQL tableDataSet to get data from a SQL table

SqlConnection

SqlDataAdapter

DataSet

Fill

Tables Rows

1

2

3

SQL Database

Page 12: Accessing Data with Microsoft Visual C# Applications

12

Scenario 4Scenario 4 – con’t– con’t Retrieve Data with DataSetRetrieve Data with DataSet

11 SqlConnection myCn = new SqlConnection(cnStr); SqlConnection myCn = new SqlConnection(cnStr);22 SqlDataAdapter myDA = new SqlDataAdapter(“Select * from SqlDataAdapter myDA = new SqlDataAdapter(“Select * from

Customers", myCn);Customers", myCn); try {try {33 DataSet myDataSet = new DataSet();DataSet myDataSet = new DataSet();44 myDA.Fill(myDataSet, "myCustomers");myDA.Fill(myDataSet, "myCustomers");55 foreach (DataRow myDataRow in foreach (DataRow myDataRow in

myDataSet.Tables["myCustomers"].Rows) myDataSet.Tables["myCustomers"].Rows) {{66

Console.WriteLine(myDataRow["CustomerId"].ToString() + Console.WriteLine(myDataRow["CustomerId"].ToString() + " " " " + myDataRow["CompanyName"].ToString());+ myDataRow["CompanyName"].ToString());

}} }} catch (Exception e) {catch (Exception e) {77 Console.WriteLine(e.Message.ToString());Console.WriteLine(e.Message.ToString()); }}

Page 13: Accessing Data with Microsoft Visual C# Applications

13

Scenario 5 Scenario 5 Read XML DataRead XML Data

Demonstrates how to get XSD schema and Demonstrates how to get XSD schema and XML data using the DataSetXML data using the DataSet

SqlConnection

SqlDataAdapter

DataSet

1

2

4

Fill

GetXml()

GetXmlSchema()

3

SQL Database

Page 14: Accessing Data with Microsoft Visual C# Applications

14

Scenario 5 Scenario 5 – con’t– con’t Read XML DataRead XML Data11 try{ try{22 SqlConnection myCn = new SqlConnection(cnStr); SqlConnection myCn = new SqlConnection(cnStr);33 SqlDataAdapter myDA1 = new SqlDataAdapter("select * from SqlDataAdapter myDA1 = new SqlDataAdapter("select * from

customers where CustomerID='ABC'", myCn);customers where CustomerID='ABC'", myCn);44 DataSet myDataSet = new DataSet(); DataSet myDataSet = new DataSet();55 myDA1.Fill(myDataSet,"Customers"); myDA1.Fill(myDataSet,"Customers");66 String strXMLData = myDataSet.GetXml(); String strXMLData = myDataSet.GetXml();77 String strXMLSchema = myDataSet.GetXmlSchema(); String strXMLSchema = myDataSet.GetXmlSchema();88 Console.WriteLine("Schema"); Console.WriteLine("Schema");99 Console.WriteLine(strXMLSchema); Console.WriteLine(strXMLSchema);1010 Console.WriteLine(""); Console.WriteLine("");1111 Console.WriteLine("Data"); Console.WriteLine("Data");1212 Console.WriteLine(strXMLData); } Console.WriteLine(strXMLData); }1313 catch(Exception e) { catch(Exception e) {1414 Console.WriteLine(e.ToString()); }Console.WriteLine(e.ToString()); }

Page 15: Accessing Data with Microsoft Visual C# Applications

15

Scenario 6 Scenario 6 Filter Data in the DataSetFilter Data in the DataSet

Demonstrates how to use DataView to filter Demonstrates how to use DataView to filter data in the DataSetdata in the DataSet

SqlConnection

SqlDataAdapter

DataSet

1

2Fill

RowFilter

3 DataView

SQL Database

Page 16: Accessing Data with Microsoft Visual C# Applications

16

Scenario 6 Scenario 6 – con’t– con’t Filter Data in DataSetFilter Data in DataSet

11 SqlConnection myCn = new SqlConnection(cnStr); SqlConnection myCn = new SqlConnection(cnStr);22 SqlDataAdapter myDA = new SqlDataAdapter("select * from SqlDataAdapter myDA = new SqlDataAdapter("select * from

customers", customers", myCn);myCn);

try {try {33 DataSet myDataSet = new DataSet();DataSet myDataSet = new DataSet();44 myDA.Fill(myDataSet,"Customers");myDA.Fill(myDataSet,"Customers");55 DataView myDV = new DataView(myDataSet.Tables["Customers"]);DataView myDV = new DataView(myDataSet.Tables["Customers"]);66 myDV.Sort = "CustomerID";myDV.Sort = "CustomerID";77 myDV.RowFilter = "City='London'";myDV.RowFilter = "City='London'";88 for (int i = 0; i < myDV.Count; i++){for (int i = 0; i < myDV.Count; i++){99 Console.Write(myDV[i]["CustomerID"].ToString() + " - " Console.Write(myDV[i]["CustomerID"].ToString() + " - "

+ + myDV[i]["CompanyName"].ToString() + "\n");myDV[i]["CompanyName"].ToString() + "\n");}}

}} catch(Exception e){catch(Exception e){

Console.WriteLine(e.ToString()); }Console.WriteLine(e.ToString()); }

Page 17: Accessing Data with Microsoft Visual C# Applications

17

Scenario 7Scenario 7Working with RelationsWorking with Relations

Demonstrates how to add relations between Demonstrates how to add relations between tables in the DataSet and iterate over the data tables in the DataSet and iterate over the data hierarchicallyhierarchically

SqlConnectionDataAdapter1(Table1)

DataSetFill

DataAdapter2(Table2)

Fill

Add

Relations

Page 18: Accessing Data with Microsoft Visual C# Applications

18

Scenario 7 Scenario 7 – con’t– con’t Working With RelationsWorking With Relations

11 SqlDataAdapter myDA1 = new SqlDataAdapter("select * from SqlDataAdapter myDA1 = new SqlDataAdapter("select * from customers",myCn);customers",myCn);

22 SqlDataAdapter myDA2 = new SqlDataAdapter("select * from Orders",myCn);SqlDataAdapter myDA2 = new SqlDataAdapter("select * from Orders",myCn);

33 DataSet myDataSet = new DataSet(); DataSet myDataSet = new DataSet();44 myDA1.Fill(myDataSet,"Customers"); myDA1.Fill(myDataSet,"Customers");55 myDA2.Fill(myDataSet,"Orders"); myDA2.Fill(myDataSet,"Orders");6 6 myDataSet.Relations.Add("CustOrder", myDataSet.Relations.Add("CustOrder",

myDataSet.Tables[“Customers"].Columns["CustomerId"], myDataSet.Tables[“Customers"].Columns["CustomerId"], myDataSet.Tables["Orders"].Columns["CustomerId"]);myDataSet.Tables["Orders"].Columns["CustomerId"]);

77 foreach (DataRow myParentRow in foreach (DataRow myParentRow in myDataSet.Tables["Customers"].Rows) myDataSet.Tables["Customers"].Rows)

{{88 Console.WriteLine("Customer: " + Console.WriteLine("Customer: " +

myParentRow["ContactName"].ToString());myParentRow["ContactName"].ToString());9 9 foreach (DataRow myChildRow inforeach (DataRow myChildRow in

myParentRow.GetChildRows(myDataSet.Relations["CustOrders"]))myParentRow.GetChildRows(myDataSet.Relations["CustOrders"])) {{1010 Console.WriteLine("Order #" + Console.WriteLine("Order #" +

myChildRow["OrderId"].ToString());myChildRow["OrderId"].ToString());}}

}}

Page 19: Accessing Data with Microsoft Visual C# Applications

19

Scenario 8Scenario 8Update Using DataSetUpdate Using DataSet

Use SqlCommand to update the data from a Use SqlCommand to update the data from a DataSetDataSet

SqlConnection

SqlDataAdapter

DataSet

Fill

Tables Rows

1

3

4

SQL Database

Update

InsertCommandUpdateCommand

2

AddEdit

5

Page 20: Accessing Data with Microsoft Visual C# Applications

20

Scenario 8 Scenario 8 – con’t– con’tUpdate Using DataSetUpdate Using DataSet11 SqlConnection myCn = new SqlConnection(cnStr); SqlConnection myCn = new SqlConnection(cnStr);22 SqlDataAdapter myDA = new SqlDataAdapter("Select * from SqlDataAdapter myDA = new SqlDataAdapter("Select * from

Region", myCn);Region", myCn);33 SqlParameter myParam = null; SqlParameter myParam = null;44 myDA.InsertCommand = new SqlCommand("Insert into Region myDA.InsertCommand = new SqlCommand("Insert into Region

(RegionID, RegionDescription) VALUES (@RegionID, 'A (RegionID, RegionDescription) VALUES (@RegionID, 'A new new region')", myCn);region')", myCn);

55 myParam = myDA.InsertCommand.Parameters.Add("@RegionID", myParam = myDA.InsertCommand.Parameters.Add("@RegionID", SqlDbType.Int);SqlDbType.Int);

66 myParam.SourceColumn = "RegionID"; myParam.SourceColumn = "RegionID";77 myDA.UpdateCommand = new SqlCommand("Update Region Set myDA.UpdateCommand = new SqlCommand("Update Region Set

RegionDescription = @RegionDescription WHERE RegionID = RegionDescription = @RegionDescription WHERE RegionID = @RegionID" , myCn);@RegionID" , myCn);

88 myParam = myDA.UpdateCommand.Parameters.Add( myParam = myDA.UpdateCommand.Parameters.Add( "@RegionID“ , SqlDbType.Int);"@RegionID“ , SqlDbType.Int);

99 myParam.SourceVersion = DataRowVersion.Original; myParam.SourceVersion = DataRowVersion.Original;

1010 myParam.SourceColumn = "RegionID"; myParam.SourceColumn = "RegionID";

Page 21: Accessing Data with Microsoft Visual C# Applications

21

Scenario 8 Scenario 8 – con’t– con’tUpdate Using DataSetUpdate Using DataSet

1111 myParam = myDA.UpdateCommand.Parameters.Add myParam = myDA.UpdateCommand.Parameters.Add ("@RegionDescription", SqlDbType.NChar, 50); ("@RegionDescription", SqlDbType.NChar, 50);

1212 myParam.SourceVersion = DataRowVersion.Current; myParam.SourceVersion = DataRowVersion.Current; 1313 myParam.SourceColumn = "RegionDescription"; myParam.SourceColumn = "RegionDescription";1414 DataSet myDataSet = new DataSet(); DataSet myDataSet = new DataSet();1515 myDA.MissingSchemaAction = myDA.MissingSchemaAction =

MissingSchemaAction.AddWithKey;MissingSchemaAction.AddWithKey;1616 myDA.Fill(myDataSet, "Region"); myDA.Fill(myDataSet, "Region");1717 DataRow myDataRow = myDataSet.Tables["Region"].Rows.Find(2);DataRow myDataRow = myDataSet.Tables["Region"].Rows.Find(2);

1818 myDataRow[1] = “This region description is modified now"; myDataRow[1] = “This region description is modified now";1919 DataRow myDataRow2 = myDataSet.Tables["Region"].NewRow(); DataRow myDataRow2 = myDataSet.Tables["Region"].NewRow();

2020 myDataRow2[0] = 901; myDataRow2[0] = 901;2121 myDataRow2[1] = "A new region"; myDataRow2[1] = "A new region";2222 myDataSet.Tables["Region"].Rows.Add(myDataRow2); myDataSet.Tables["Region"].Rows.Add(myDataRow2);2323 myDA.Update(myDataSet, "Region"); myDA.Update(myDataSet, "Region");

Page 22: Accessing Data with Microsoft Visual C# Applications

22

Scenario 9Scenario 9Handling Update ErrorsHandling Update Errors

SqlDataAdapter2(Table2)

Rows

SqlDataAdapter1(Table1)Fill

DataSet

Fill

Tables

NewRow()

TablesEdit Add

Handle Errors

2

5

3 4

SqlCommandBuilder

1

Update

6

Page 23: Accessing Data with Microsoft Visual C# Applications

23

Scenario 9 Scenario 9 – con’t– con’t Handling Update ErrorsHandling Update Errors

11 DataSet myDataSet = new DataSet(); DataSet myDataSet = new DataSet();

22 DataRow myDataRow; DataRow myDataRow;

33 DataSet newDataSet; DataSet newDataSet;

44 DataRow[] rowsInError; DataRow[] rowsInError;

55 SqlConnection myCn = new SqlConnection(cnStr); SqlConnection myCn = new SqlConnection(cnStr);

66 SqlDataAdapter myDACust = new SqlDataAdapter myDACust = new SqlDataAdapter("Select * From Customers", myCn);SqlDataAdapter("Select * From Customers", myCn);

77 SqlDataAdapter myDAOrd = new SqlDataAdapter myDAOrd = new SqlDataAdapter("Select * From Orders", myCn);SqlDataAdapter("Select * From Orders", myCn);

88 SqlCommandBuilder myCmdBlder = new SqlCommandBuilder myCmdBlder = new SqlCommandBuilder(myDACust);SqlCommandBuilder(myDACust);

Page 24: Accessing Data with Microsoft Visual C# Applications

24

Scenario 9 Scenario 9 – con’t– con’t Handling Update ErrorsHandling Update Errors

99 myDACust.MissingSchemaAction = myDACust.MissingSchemaAction =

MissingSchemaAction.AddWithKey;MissingSchemaAction.AddWithKey;

1010 myDAOrd.MissingSchemaAction = myDAOrd.MissingSchemaAction =

MissingSchemaAction.AddWithKey;MissingSchemaAction.AddWithKey;

1111 myDACust.Fill(myDataSet,"Customers"); myDACust.Fill(myDataSet,"Customers");

1212 myDAOrd.Fill(myDataSet,"Orders"); myDAOrd.Fill(myDataSet,"Orders");

13 13 myDataSet.Relations.Add("CustOrders",myDataSet.Tables myDataSet.Relations.Add("CustOrders",myDataSet.Tables [“Customers"].Columns["CustomerId"],myDataSet.Tables["Orde[“Customers"].Columns["CustomerId"],myDataSet.Tables["Orders"].Columns["CustomerId"]);rs"].Columns["CustomerId"]);

1414 myDataSet.Tables["Customers"].Rows[0]["ContactName"]= myDataSet.Tables["Customers"].Rows[0]["ContactName"]= "Peaches";"Peaches";

1515 myDataRow = myDataSet.Tables["Customers"].NewRow(); myDataRow = myDataSet.Tables["Customers"].NewRow();

1616 myDataRow["CustomerId"] ="NewID"; myDataRow["CustomerId"] ="NewID";

1717 myDataRow["ContactName"] = "New Name"; myDataRow["ContactName"] = "New Name";

1818 myDataRow["CompanyName"] = "New Company Name"; myDataRow["CompanyName"] = "New Company Name";

1919 myDataSet.Tables["Customers"].Rows.Add(myDataRow); myDataSet.Tables["Customers"].Rows.Add(myDataRow);

Page 25: Accessing Data with Microsoft Visual C# Applications

25

Scenario 9 Scenario 9 – con’t– con’t Handling Update ErrorsHandling Update Errors

2626 if (myDataSet.HasChanges(DataRowState.Modified | DataRowState.Added)) { if (myDataSet.HasChanges(DataRowState.Modified | DataRowState.Added)) {2727 newDataSet = myDataSet.GetChanges(DataRowState.Modified | newDataSet = myDataSet.GetChanges(DataRowState.Modified |

DataRowState.Added);DataRowState.Added);2828 if(!newDataSet.HasErrors) {if(!newDataSet.HasErrors) {2929 newDataSet.Merge(myDataSet);newDataSet.Merge(myDataSet);3030 myDACust.Update(myDataSet, "Customers");myDACust.Update(myDataSet, "Customers"); }}

3131 else {else {3232 foreach(DataTable newTable in newDataSet.Tables) { foreach(DataTable newTable in newDataSet.Tables) { 3333 if(newTable.HasErrors) { if(newTable.HasErrors) {3434 rowsInError = newTable.GetErrors(); rowsInError = newTable.GetErrors();3535 for(int i = 0; i < rowsInError.Length; i++) { for(int i = 0; i < rowsInError.Length; i++) {3636 foreach(DataColumn newCol in foreach(DataColumn newCol in

newTable.Columns) {newTable.Columns) {3737 Console.WriteLine(newCol.ColumnName + " Console.WriteLine(newCol.ColumnName + "

" + " + rowsInError[i].GetColumnError(newCol));rowsInError[i].GetColumnError(newCol));}}

3838 rowsInError[i].ClearErrors();rowsInError[i].ClearErrors(); }}

}} }}

}} } }

Page 26: Accessing Data with Microsoft Visual C# Applications

26

Scenario 10Scenario 10Update Using Database TransactionsUpdate Using Database Transactions

SqlConnection

SqlCommand

Commit()

SqlTransaction

BeginTransaction()

Rollback()

1 2

3

4

Page 27: Accessing Data with Microsoft Visual C# Applications

27

Scenario 10 Scenario 10 – con’t– con’tUpdate Using Database TransactionsUpdate Using Database Transactions

11 SqlConnection myCn = new SqlConnection(cnStr); SqlConnection myCn = new SqlConnection(cnStr);22 SqlCommand myCmd = new SqlCommand(); SqlCommand myCmd = new SqlCommand();33 SqlTransaction myTrans; SqlTransaction myTrans;44 myCn.Open(); myCn.Open();55 myCmd.Connection = myCn; myCmd.Connection = myCn;66 myTrans = myCn.BeginTransaction(); myTrans = myCn.BeginTransaction();77 myCmd.Transaction = myTrans; myCmd.Transaction = myTrans; try {try {88 myCmd.CommandText = "Insert into Region (Region, myCmd.CommandText = "Insert into Region (Region,

Description) VALUES (500, ‘Western')";Description) VALUES (500, ‘Western')";99 myCmd.ExecuteNonQuery();myCmd.ExecuteNonQuery();1010 myCmd.CommandText = "Insert into Region (Region, myCmd.CommandText = "Insert into Region (Region,

Description) VALUES (501, 'Eastern')";Description) VALUES (501, 'Eastern')";1111 myCmd.ExecuteNonQuery();myCmd.ExecuteNonQuery();1212 myTrans.Commit(); }myTrans.Commit(); } catch(Exception e) {catch(Exception e) {1313 myTrans.Rollback();myTrans.Rollback();

Console.WriteLine(e.ToString()); } Console.WriteLine(e.ToString()); }

Page 28: Accessing Data with Microsoft Visual C# Applications

28

Scenario 11 Scenario 11 Connection PoolingConnection Pooling

Minimum and maximum number of Minimum and maximum number of connections in the poolconnections in the pool

Use connections in the poolUse connections in the pool Create new connections in the poolCreate new connections in the pool Return connections to the poolReturn connections to the pool Create new connections in a different poolCreate new connections in a different pool

Page 29: Accessing Data with Microsoft Visual C# Applications

29

Scenario 11 Scenario 11 – con’t– con’t Connection PoolingConnection Pooling11 String cnStr1, cnStr2;String cnStr1, cnStr2;22 cnStr1 = "server=server;uid=uid;pwd=***;database=northwind; cnStr1 = "server=server;uid=uid;pwd=***;database=northwind;

pooling=true;connection lifetime=5;min pool size=1;max pool size=50";pooling=true;connection lifetime=5;min pool size=1;max pool size=50";33 SqlConnection myCn1 = new SqlConnection(cnStr1);SqlConnection myCn1 = new SqlConnection(cnStr1);44 SqlConnection myCn2 = new SqlConnection(cnStr1);SqlConnection myCn2 = new SqlConnection(cnStr1);55 SqlConnection myCn3 = new SqlConnection(cnStr1);SqlConnection myCn3 = new SqlConnection(cnStr1);

66 myCn1.Open();myCn1.Open();77 myCn2.Open();myCn2.Open();88 myCn1.Close();myCn1.Close();99 myCn2.Close();myCn2.Close();

1010 myCn1.Open();myCn1.Open();1111 myCn2.Open();myCn2.Open();1212 myCn3.Open();myCn3.Open();1313 myCn1.Close();myCn1.Close();1414 myCn2.Close();myCn2.Close();1515 myCn3.Close();myCn3.Close();

1616 SqlConnection myCn4 = new SqlConnection(cnStr2);SqlConnection myCn4 = new SqlConnection(cnStr2);1717 myCn4.Open();myCn4.Open();1818 myCn4.Close();myCn4.Close();

Page 30: Accessing Data with Microsoft Visual C# Applications

30

Scenario 12Scenario 12Using ADO Recordset in ADO.NETUsing ADO Recordset in ADO.NET

SqlDataAdapter

ADO Recordset

DataSet

Fill

DBGetXml()

1

2

3

Page 31: Accessing Data with Microsoft Visual C# Applications

31

Scenario 12Scenario 12Using ADO Recordset in ADO.NET Using ADO Recordset in ADO.NET via COM InterOp Layervia COM InterOp Layer

11 ADODB.Recordset rsObj = new ADODB.Recordset(); ADODB.Recordset rsObj = new ADODB.Recordset();22 String cnstr = “server=server;uid=id;pwd=***; String cnstr = “server=server;uid=id;pwd=***;

database=Northwind; provider=sqloledb";database=Northwind; provider=sqloledb";33 rsObj.Open("Customers",cnstr, rsObj.Open("Customers",cnstr,

ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockOptimistic,2);ADODB.LockTypeEnum.adLockOptimistic,2);

44 DataSet myDataSet = new DataSet(); DataSet myDataSet = new DataSet();55 OleDbDataAdapter adapter = new OleDbDataAdapter(); OleDbDataAdapter adapter = new OleDbDataAdapter();6 6 adapter.MissingSchemaAction = adapter.MissingSchemaAction =

MissingSchemaAction.AddWithKey;MissingSchemaAction.AddWithKey;77 int count = adapter.Fill(myDataSet, rsObj, int count = adapter.Fill(myDataSet, rsObj,

"ADODB.RecordSet");"ADODB.RecordSet");88 Console.WriteLine(myDataSet.GetXml()); Console.WriteLine(myDataSet.GetXml());

Page 32: Accessing Data with Microsoft Visual C# Applications

32

Scenario 12Scenario 12Using ADO Recordset in ADO.NET via ReflectionUsing ADO Recordset in ADO.NET via Reflection

11 Type rsType = Type.GetTypeFromProgID("ADODB.RecordSet"); Type rsType = Type.GetTypeFromProgID("ADODB.RecordSet");22 object rsObj = Activator.CreateInstance(rsType); object rsObj = Activator.CreateInstance(rsType);33 String cnstr = "server=srv;uid=myID;pwd=myPwd;database= String cnstr = "server=srv;uid=myID;pwd=myPwd;database=

Northwind;provider=sqloledb";Northwind;provider=sqloledb";44 object[] values = new object[] {“Customers", cnstr, 0, 1, 2}; object[] values = new object[] {“Customers", cnstr, 0, 1, 2};55 rsType.InvokeMember("Open", BindingFlags.InvokeMethod, null, rsType.InvokeMember("Open", BindingFlags.InvokeMethod, null,

rsObj, values);rsObj, values);66 DataSet myDataSet = new DataSet(); DataSet myDataSet = new DataSet();77 OleDbDataAdapter adapter = new OleDbDataAdapter(); OleDbDataAdapter adapter = new OleDbDataAdapter();88 adapter.MissingSchemaAction = adapter.MissingSchemaAction =

MissingSchemaAction.AddWithKey;MissingSchemaAction.AddWithKey;99 int count = adapter.Fill(myDataSet, rsObj, "ADODB.RecordSet"); int count = adapter.Fill(myDataSet, rsObj, "ADODB.RecordSet");1010 Console.WriteLine(myDataSet.GetXml()); Console.WriteLine(myDataSet.GetXml());

Page 33: Accessing Data with Microsoft Visual C# Applications

33

ExceptionsExceptions

Error or unexpected behaviorError or unexpected behavior Come from:Come from:

An executing program An executing program The run time environmentThe run time environment

Passed up the stack: either handled by Passed up the stack: either handled by application or program terminatesapplication or program terminates

Derived from the Exception class defined in Derived from the Exception class defined in the system namespacethe system namespace

Page 34: Accessing Data with Microsoft Visual C# Applications

34

ADO .NET ExceptionsADO .NET Exceptions

Defined in System.DataDefined in System.Data Single exception class for each .NET data Single exception class for each .NET data

provider namespace:provider namespace: SqlExceptionSqlException OleDbExceptionOleDbException OdbcExceptionOdbcException

Most System.Data exception classes do not add Most System.Data exception classes do not add any additional properties or methodsany additional properties or methods

SqlException and OleDbException both support SqlException and OleDbException both support the traditional ADO-style Errors collectionthe traditional ADO-style Errors collection

Page 35: Accessing Data with Microsoft Visual C# Applications

35

Try..Catch..BlockTry..Catch..Block

try try {{

myCn.Open();myCn.Open();}}catch(Exception e) catch(Exception e) {{

Console.WriteLine(e.ToString());Console.WriteLine(e.ToString());}}finally finally {{

myCn.Close();myCn.Close();}}

Page 36: Accessing Data with Microsoft Visual C# Applications

36

Try..Catch..Block (2)Try..Catch..Block (2)

Always order catch blocks/exceptions from Always order catch blocks/exceptions from most specific to least specificmost specific to least specific That is, don’t put Exception before a SqlException That is, don’t put Exception before a SqlException

catch blockcatch block

Throw exceptions only in exceptional casesThrow exceptions only in exceptional cases Do not use exceptions for normal or expected Do not use exceptions for normal or expected

errors or for normal flow of controlerrors or for normal flow of control

Page 37: Accessing Data with Microsoft Visual C# Applications

37

Additional ResourcesAdditional Resources

MSDN online:MSDN online:

http://msdn.microsoft.com/voices/data.asphttp://msdn.microsoft.com/voices/data.asp

.NET SDK documentation.NET SDK documentation

Page 38: Accessing Data with Microsoft Visual C# Applications

38