Wrox Programmer Forums
Go Back   Wrox Programmer Forums > C# and C > C# 1.0 > BOOK: Beginning Visual C#
|
BOOK: Beginning Visual C#
This is the forum to discuss the Wrox book Beginning Visual C#, Revised Edition of Beginning C# for .NET v1.0 by Karli Watson, David Espinosa, Zach Greenvoss, Jacob Hammer Pedersen, Christian Nagel, Jon D. Reid, Matthew Reynolds, Morgan Skinner, Eric White; ISBN: 9780764543821
Welcome to the p2p.wrox.com Forums.

You are currently viewing the BOOK: Beginning Visual C# section of the Wrox Programmer to Programmer discussions. This is a community of software programmers and website developers including Wrox book authors and readers. New member registration was closed in 2019. New posts were shut off and the site was archived into this static format as of October 1, 2020. If you require technical support for a Wrox book please contact http://hub.wiley.com
 
Old October 7th, 2004, 05:46 PM
Authorized User
 
Join Date: Jul 2004
Posts: 59
Thanks: 0
Thanked 0 Times in 0 Posts
Default Beginning Visual C# Exercises - Chapter 19 Answers

Add ADO.NET and SQL Server namespace directives to top for all following...
        using System.Data;
        using System.Data.SqlClient;

1. In Main() method...
        // Specify SQL Server specific connection string
        SqlConnection thisConnection = new SqlConnection(
            @"Data Source=(local);Integrated Security=SSPI;Initial Catalog=northwind");

        // Open connection
        thisConnection.Open();

        // Create command for this connection
        SqlCommand thisCommand = thisConnection.CreateCommand();

        // Specify SQL query for this command
        thisCommand.CommandText = "SELECT EmployeeID, LastName from Employees";

        // Execute DataReader for specified command
        SqlDataReader thisReader = thisCommand.ExecuteReader();

        //While there are rows to read
        while (thisReader.Read())
        {
            // Output ID and name columns
            Console.WriteLine("\t{0}\t{1}", thisReader["EmployeeID"], thisReader["LastName"]);
        }

        // Close reader & connection
        thisReader.Close();
        thisConnection.Close();

2. Replace assignment in "UpdatingData" class Main()...
        <s>// thisDataSet.Tables["Customers"].Rows[9]["CompanyName"] = "Acme, Inc.";</s>

        // Toggle between these two company names for exercise
        string companyNameAcme = "Acme, Inc.";
        string companyNameBottom = "Bottom-Dollar Markets";

        // Change data in Customers table, row 9, CompanyName column
        if ((string)thisDataSet.Tables["Customers"].Rows[9]["CompanyName"] == companyNameAcme)
        {
            thisDataSet.Tables["Customers"].Rows[9]["CompanyName"] = companyNameAcme;
        }
        else
        {
            thisDataSet.Tables["Customers"].Rows[9]["CompanyName"] = companyNameBottom;
        }

3. In Main(), ask for CustomerID then verify that it exists...
        Console.WriteLine("Enter five character upper case Customer ID");
        string theCustomerID = Console.ReadLine();

        if (theCustomerID.Length == 5)
        {
            // Specify SQL Server specific connection string
            SqlConnection thisConnection = new SqlConnection(
                @"Data Source=(local);Integrated Security=SSPI;Initial Catalog=northwind");

            // Create DataSet to contain related data tables, rows, and columns
            DataSet thisDataSet = new DataSet();

            // Create DataAdapter object
            SqlDataAdapter thisAdapter = new SqlDataAdapter(
                "SELECT CustomerID, CompanyName From Customers", thisConnection);
            thisAdapter.Fill(thisDataSet, "Customers");

            // Set up keys object for defining primary key
            DataColumn[] keys = new DataColumn[1];
            keys[0] = thisDataSet.Tables["Customers"].Columns["CustomerID"];
            thisDataSet.Tables["Customers"].PrimaryKey = keys;

            DataRow findRow = thisDataSet.Tables["Customers"].Rows.Find(theCustomerID);

            if (findRow == null)
            {
                // Advise user his input is bogus
                Console.WriteLine("Your requested customer ID '" + theCustomerID + "' not found");
            }
            else
            {
                // Advise user his input found a customer
                Console.WriteLine(theCustomerID + " represents NorthWind customer {0}",
                    findRow["CompanyName"]);
            }
        }
        else
        {
            // Advise user his input is dismal
            Console.WriteLine("Your input was not valid to commence search.");
        }

4. Code within the MAIN() function...
        Note that Orders SQL table has three fields with data constraints
        // Specify SQL Server specific connection string
        SqlConnection thisConnection = new SqlConnection(
            @"Data Source=(local);Integrated Security=SSPI;Initial Catalog=northwind");

        // Create DataAdapter object
        SqlDataAdapter thisAdapter = new SqlDataAdapter(
                "SELECT CustomerID,EmployeeID,OrderDate,RequiredDate," +
                "ShipVia,Freight,ShipName,ShipAddress,ShipCity,Shi pRegion," +
                "ShipPostalCode,ShipCountry From Orders", thisConnection);

        // Create the CommandBuilder object to build SQL commands
        SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisAdapter);

        // Create DataSet to contain related data tables, rows, and columns
        DataSet thisDataSet = new DataSet();

        // Fill DataSet using query defined previously for DataAdapter
        thisAdapter.Fill(thisDataSet, "Orders");

        // Observe CustomerID foreign key constraint in Orders
        string customerZacheryZithers = "ZACZI";
        // Observe EmployeeID foreign key constraint in Orders
        int employeeSteveBuchanan = 5;
        // Observe ShipVia foreign key constraint in Orders
        int shipperUnitedPackage = 2;

        // New row #1
        DataRow rowOrders01 = thisDataSet.Tables["Orders"].NewRow();
        rowOrders01["CustomerID"] = customerZacheryZithers;
        rowOrders01["EmployeeID"] = employeeSteveBuchanan;
        rowOrders01["OrderDate"] = Convert.ToDateTime("2004/08/30");
        rowOrders01["RequiredDate"] = Convert.ToDateTime("2004/09/15");
        rowOrders01["ShipVia"] = shipperUnitedPackage;
        rowOrders01["Freight"] = Convert.ToDecimal("17.17");
        rowOrders01["ShipName"] = "The Shopping Center";
        rowOrders01["ShipAddress"] = "123 East Michigan Avenue";
        rowOrders01["ShipCity"] = "Paw Paw";
        rowOrders01["ShipRegion"] = "MI";
        rowOrders01["ShipPostalCode"] = "49079";
        rowOrders01["ShipCountry"] = "USA";
        thisDataSet.Tables["Orders"].Rows.Add(rowOrders01);

        // New row #2
        DataRow rowOrders02 = thisDataSet.Tables["Orders"].NewRow();
        rowOrders02["CustomerID"] = customerZacheryZithers;
        rowOrders02["EmployeeID"] = employeeSteveBuchanan;
        rowOrders02["OrderDate"] = Convert.ToDateTime("2004/09/21");
        rowOrders02["RequiredDate"] = Convert.ToDateTime("2004/10/15");
        rowOrders02["ShipVia"] = shipperUnitedPackage;
        rowOrders02["Freight"] = Convert.ToDecimal("10.12");
        rowOrders02["ShipName"] = "Jewel Supermarkets";
        rowOrders02["ShipAddress"] = "123 West Main Street";
        rowOrders02["ShipCity"] = "Dyer";
        rowOrders02["ShipRegion"] = "IN";
        rowOrders02["ShipPostalCode"] = "47923";
        rowOrders02["ShipCountry"] = "USA";
        thisDataSet.Tables["Orders"].Rows.Add(rowOrders02);

        // Write to SQL table
        try
        {
            thisAdapter.Update(thisDataSet, "Orders");
        }
        catch (System.Data.SqlClient.SqlException e)
        {
            // This is how I found out about the constraints
            Console.WriteLine("Exception is {0}", e.Message);
            return;
        }

        // Now display orders within last six months; DATEDIFF() is T-SQL function
        SqlCommand thisCommand = thisConnection.CreateCommand();
        thisCommand.CommandText =
            "SELECT OrderID, RequiredDate, ShipName, ShipAddress, " +
            "RTRIM(ShipCity) + ', ' + ShipRegion AS ShipLocale " +
            "FROM Orders WHERE CustomerID='" + customerZacheryZithers + "' AND " +
            "(DATEDIFF(day, OrderDate, GETDATE()) <= 180)";
        thisConnection.Open();

        // Load result set into the data reader
        SqlDataReader thisReader = thisCommand.ExecuteReader();
        while (thisReader.Read())
        {
            Console.WriteLine("{0}\t{1}\n{2}\n{3}\n{4}\n",
                thisReader["OrderID"], thisReader["RequiredDate"],
                thisReader["ShipName"], thisReader["ShipAddress"],
                thisReader["ShipLocale"]);
        }

        thisReader.Close();
        thisConnection.Close();

        Console.ReadLine();

5. Code within the MAIN() function...
        // Specify SQL Server specific connection string
        SqlConnection thisConnection = new SqlConnection(
            @"Data Source=(local);Integrated Security=SSPI;Initial Catalog=northwind");

        // Create DataSet to contain related data tables, rows, and columns
        DataSet thisDataSet = new DataSet();

        // Set up DataAdapter objects for each table and fill
        SqlDataAdapter supplierAdapter = new SqlDataAdapter(
            "SELECT SupplierID, CompanyName, ContactName from Suppliers",
            thisConnection);
        supplierAdapter.Fill(thisDataSet, "Suppliers");

        SqlDataAdapter productAdapter = new SqlDataAdapter(
            "SELECT SupplierID, CategoryID, ProductName from Products",
            thisConnection);
        productAdapter.Fill(thisDataSet, "Products");

        SqlDataAdapter categoryAdapter = new SqlDataAdapter(
            "SELECT CategoryID, CategoryName, Description from Categories",
            thisConnection);
        categoryAdapter.Fill(thisDataSet, "Categories");

        // Set up DataRelation between Products and Suppliers tables
        DataRelation SupplierProductRel = thisDataSet.Relations.Add("SuppProducts",
        thisDataSet.Tables["Suppliers"].Columns["SupplierID"],
        thisDataSet.Tables["Products"].Columns["SupplierID"]);

        // Set up DataRelation between Products and Categories tables
        DataRelation ProductCategoriesRel = thisDataSet.Relations.Add("ProdCategories",
        thisDataSet.Tables["Categories"].Columns["CategoryID"],
        thisDataSet.Tables["Products"].Columns["CategoryID"]);

        // Print suppliers nested products and their categories
        foreach (DataRow suppRow in thisDataSet.Tables["Suppliers"].Rows)
        {
            Console.WriteLine("Supplier: " + suppRow["CompanyName"]);
            Console.WriteLine(" Contact: " + suppRow["ContactName"]);

            foreach (DataRow prodRow in suppRow.GetChildRows(SupplierProductRel))
            {
                Console.WriteLine("\tProduct: " + prodRow["ProductName"]);

                foreach (DataRow categoryRow in prodRow.GetParentRows(ProductCategoriesRel))
                {
                    Console.WriteLine("\t Category: " + categoryRow["CategoryName"]);
                    Console.WriteLine("\t Details: " + categoryRow["Description"] + "\n");
                }
            }
        }

        Console.ReadLine();

6. Insert following just before or after the FOREACH loop region of Exercise 05...
        SupplierProductRel.Nested = true;
        // Product table is child in both relationships preventing further nesting
        <s>//ProductCategoriesRel.Nested = true;</s>
        thisDataSet.WriteXml(@"d:\temp\exercise06.xml");
        Console.WriteLine("XML table has been written!");
        Console.ReadLine();

7. Modify SQL command in "ManyRelations" with a "WHERE" clause...
                    -- AND --
        use overload of "DATACOLLECTION.ADD()" to ignore constraint
            from unmatched Orders.CustomerID values
        // Set up DataAdapter objects for each table and fill
        <s>// SqlDataAdapter custAdapter = new SqlDataAdapter(</s>
            <s>"SELECT * from Customers", thisConnection);</s>
        //Pull only customers whose names begin A through M
        SqlDataAdapter custAdapter = new SqlDataAdapter(
            "SELECT * from Customers WHERE LEFT(CustomerID, 1) <= 'M'",
            thisConnection);
        custAdapter.Fill(thisDataSet, "Customers");

        SqlDataAdapter orderAdapter = new SqlDataAdapter(
            "SELECT * from Orders",
            thisConnection);
        orderAdapter.Fill(thisDataSet, "Orders");

        // Set up DataRelation between customers and orders tables
        <s>DataRelation custOrderRel = thisDataSet.Relations.Add("CustOrders",</s>
            <s>thisDataSet.Tables["Customers"].Columns["CustomerID"],</s>
            <s>thisDataSet.Tables["Orders"].Columns["CustomerID"])</s>
        DataRelation custOrderRel = thisDataSet.Relations.Add("CustOrders",
            thisDataSet.Tables["Customers"].Columns["CustomerID"],
            thisDataSet.Tables["Orders"].Columns["CustomerID"],
            false);

8. Replace the SQL command in "ShowSQL" as requested...
        // Set up DataAdapter objects for each table and fill
        <s>//SqlDataAdapter thisAdapter = new SqlDataAdapter(</s>
            <s>"SELECT CustomerID from Customers", thisConnection);</s>
        SqlDataAdapter thisAdapter = new SqlDataAdapter(
            "SELECT * from Customers", thisConnection);

        ... Then run application and observe
 
Old October 8th, 2004, 05:05 PM
Friend of Wrox
 
Join Date: Jun 2003
Posts: 1,998
Thanks: 0
Thanked 3 Times in 3 Posts
Default

Are you posting this as a correction?









Powered by vBulletin®
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Copyright (c) 2020 John Wiley & Sons, Inc.