Low Level ADO.NET Operations Microsoft Visual C# 2008 Step by Step Chapter 25 1 Objectives You will be able to Write C# programs that perform SQL Select operations on a database table and display the results in a Windows form. Open a new Windows form and pass information to it from the original form. 2 Overview The Northwind Traders Database A Windows program to browse a table. Getting information for connection string at run time SqlConnection object SqlCommand object Connection String Command String Peforming a Select command Browsing the results 3 The Northwind Traders Database Classic Microsoft Example Database Free download from Microsoft. Can install on your own computer if you have MS SQL Server. Read-only version on scorpius Installation instructions in Chapter 25 SQL script instnwnd.sql We will use scorpius for examples and projects. 4 The Northwind Traders Database Visual C# 2008 Step by Step, page 500 5 Accessing Scorpius Unless you are on a wired connection to the USF network, you will need to set up a VPN connection. (Virtual Private Network) https://vpn.usf.edu/ See http://www.cse.usf.edu/~turnerr/Web_Application_Design/ 017_Mapping_a_Drive.pdf Slides 2 - 7 You do not need to map a drive, as described in the rest of this presentation. 6 Opening VPN Connection Once you have installed the VPN software on your computer, you only need to open the connection: All Programs Juniper Networks Network Connect 6.5.0 Network Connect You can put a shortcut to Network Connect on your desktop. Right click on the menu command. Select Create Shortcut Drag the shortcut to the desktop 7 Network Connect This says that you are connected through the VPN: 8 Add Connection for Northwinds Database In Visual Studio 2008 Server Explorer Note: Visual Studio 2010 Server Explorer does not work with Scorpius. 9 Add Connection for Northwinds Database 10 The Northwind Traders Database 11 Products 12 Employees 13 Northwind Product Browser Simple example to illustrate use of ADO primitives for low level access. Will get the username and password from textboxes. Open a new Windows form to display Product information. For now, display Product Name only. Will extend to display more infomation. 14 Northwinds Product Browser Create a new Visual C# Windows Forms application. .NET Framework 3.5 15 Initial Form Set UseSystemPasswordChar property of tbPassword to true. 16 Form1.cs using using using using using System; System.Collections.Generic; System.Data; System.Data.SqlClient; System.Windows.Forms; namespace Product_Browser { public partial class Form1 : Form { List<String> Product_List; public Form1() { InitializeComponent(); } 17 btnGetData_Click() private void btnGetData_Click(object sender, EventArgs e) { SqlDataReader rdr; SqlConnection cn; Product_List = new List<string>(); try { cn = Setup_Connection(); rdr = Get_SqlDataReader(cn); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } 18 btnGetData_Click() while (rdr.Read()) { String Product_Name = (String)rdr["ProductName"]; Product_List.Add(Product_Name); } rdr.Close(); cn.Close(); Product_Information Product_Info_Form = new Product_Information(Product_List); Comment this out temporarily this.Hide(); Product_Info_Form.ShowDialog(); this.Close(); } 19 Setup_Connection() private SqlConnection Setup_Connection() { String connection_string = "server=scorpius.eng.usf.edu; " + "database=Northwind;" + "User=" + tbUserName.Text + "; " + "Password=" + tbPassword.Text; SqlConnection conn = new SqlConnection(connection_string); conn.Open(); return conn; } 20 Get_SqlDataReader() private SqlDataReader Get_SqlDataReader(SqlConnection conn) { SqlCommand cmd = new SqlCommand(); cmd.CommandText ="SELECT ProductName FROM Products"; cmd.Connection = conn; return cmd.ExecuteReader(); } 21 Add a Second Windows Form 22 Add a Second Windows Form 23 Design the Form 24 Product_Information.cs using System; using System.Collections.Generic; using System.Windows.Forms; namespace Product_Browser { public partial class Product_Information : Form { int Current_Record_Number; List<String> Product_List; // Constructor public Product_Information(List<String> Product_List_Arg) { InitializeComponent(); this.Product_List = Product_List_Arg; Current_Record_Number = 0; Display_Current_Record(); } 25 Product_Information.cs Add stub for Display_Current_Record. void Display_Current_Record() { } 26 Back in Form1.cs At end of btnGetData_Click: Product_Information Product_Info_Form = new Product_Information(Product_List); this.Hide(); Product_Info_Form.ShowDialog(); this.Close(); } Build and run 27 First Form 28 Second Form 29 Product_Information.cs Now we need to fill in the code for the Product Information form to do its work. 30 Display_Current_Record() private void Display_Current_Record() { tbProductName.Text = Product_List[Current_Record_Number]; tbRecordNumber.Text = "Record " + (Current_Record_Number + 1) + " of " + Product_List.Count; Update_Buttons(); } 31 Update_Buttons() private void Update_Buttons() { btnFirst.Enabled = Current_Record_Number > 0; btnNext.Enabled = Current_Record_Number < Product_List.Count - 1; btnPrev.Enabled = Current_Record_Number > 0; btnLast.Enabled = Current_Record_Number < Product_List.Count - 1; } Build and run 32 First Form 33 Second Form 34 Button Click Event Handlers Double click on each button on the Product_Informaiton form to add an event handler. 35 Button Click Methods private void btnFirst_Click(object sender, System.EventArgs e) { Current_Record_Number = 0; Display_Current_Record(); } private void btnPrev_Click(object sender, System.EventArgs e) { Current_Record_Number-=1; Display_Current_Record(); } private void btnNext_Click(object sender, System.EventArgs e) { Current_Record_Number+=1; Display_Current_Record(); } private void btnLast_Click(object sender, System.EventArgs e) { Current_Record_Number = Product_List.Count -1; Display_Current_Record(); 36 } Product Browser in Action 37 Product Browser in Action 38 Product Browser in Action 39 Shutting Down The Form1 object exists while the Product_Information form is being used. When the user clicks the Close button on the Product_Information form, control returns to Form1. But it is not visible on the screen. Following Product_Info_Form.ShowDialog(); The Form1 object calls Close() terminating the program. 40