Executing Multiple SQL Statements

Typically, your C# program and the database will run on different computers and communicate over a network. Each time you execute a command in your program, it has to travel over the network to the database and be executed by the database, and any results must be sent back across the network to your program. That's a lot of network traffic! One way to potentially reduce network traffic is to execute multiple SQL statements at a time.

In this section, you'll see how to execute multiple SELECT statements and retrieve results, and you'll see how to execute multiple SELECT, INSERT, UPDATE, and DELETE statements that are interleaved.

Executing Multiple SELECT Statements

Let's take a look at how you execute multiple SELECT statements and retrieve the results. The following code first creates a SqlCommand object named mySqlCommand and sets its CommandText property to three different SELECT statements:

 SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); mySqlCommand.CommandText =   "SELECT TOP 5 ProductID, ProductName " +   "FROM Products " +   "ORDER BY ProductID;" +   "SELECT TOP 3 CustomerID, CompanyName " +   "FROM Customers " +   "ORDER BY CustomerID;" +   "SELECT TOP 6 OrderID, CustomerID " +   "FROM Orders " +   "ORDER BY OrderID;"; 

Notice that all of the SELECT statements are separated by semi-colons.

start sidebar
Using Table Joins

Be careful to retrieve only the rows and columns you actually need. Also, make sure you use SELECT statements that retrieve rows from multiple tables. For example, if you want to see all the orders placed by the customer with the CustomerID of ALFKI, don't perform two separate SELECT statements against the Customers and Orders tables. Instead, use a table join, as shown in the following SELECT statement:

 SELECT Customers.CustomerID, CompanyName, OrderID FROM Customers, Orders WHERE Customers.CustomerID = Orders.CustomerID AND Customers.CustomerID = 'ALFKI'; 

end sidebar

To run earlier SQL statements, you call the ExecuteReader() method, which returns a SqlDataReader object:

 SqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader(); 

The command will return three result sets, one for each SELECT statement. To read the first result set, you call the Read() method of mySqlDataReader. The Read() method returns false when there are no more rows to read. Once you're at the end of a result set, you call the NextResult() method of mySqlDataReader before reading the next result set. The NextResult() method advances mySqlDataReader onto the next result set and returns false when there are no more result sets.

The following code illustrates the use of the Read() and NextResult() methods to read the three result sets from the SELECT statements:

 do {   while (mySqlDataReader.Read())   {     Console.WriteLine("mySqlDataReader[0] = " +       mySqlDataReader[0]);     Console.WriteLine("mySqlDataReader[1] = " +       mySqlDataReader[1]);   } } while (mySqlDataReader.NextResult()); 

Notice the use of the outer dowhile loop, which tests the return value from mySqlDataReader.NextResult() at the end. Because a dowhile loop checks the condition at the end of the loop, this means that the statements in the dowhile loop execute at least once. You want to put the call to NextResult() at the end because it first attempts to advance mySqlDataReader to the next result set and then returns the Boolean result that indicates whether there is another result set to move to. If you put the call to NextResult() in a regular while loop, then mySqlDataReader would skip over the first result set, and you don't want to do that!

Listing 9.4 illustrates how to execute multiple SELECT statements and read the results.

Listing 9.4: EXECUTEMULTIPLESELECTS.CS

start example
 /*   ExecuteMultipleSelects.cs illustrates how to execute   multiple SELECT statements using a SqlCommand object   and read the results using a SqlDataReader object */ using System; using System.Data; using System.Data.SqlClient; class ExecuteSelect {   public static void Main()   {     SqlConnection mySqlConnection =       new SqlConnection(         "server=localhost;database=Northwind;uid=sa;pwd=sa"       );     SqlCommand mySqlCommand = mySqlConnection.CreateCommand();     // set the CommandText property of the SqlCommand object to     // the mutliple SELECT statements     mySqlCommand.CommandText =       "SELECT TOP 5 ProductID, ProductName " +       "FROM Products " +       "ORDER BY ProductID;" +       "SELECT TOP 3 CustomerID, CompanyName " +       "FROM Customers " +       "ORDER BY CustomerID;" +       "SELECT TOP 6 OrderID, CustomerID " +       "FROM Orders " +       "ORDER BY OrderID;";     mySqlConnection.Open();     SqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader();     // read the result sets from the SqlDataReader object using     // the Read() and NextResult() methods     do     {       while (mySqlDataReader.Read())       {         Console.WriteLine("mySqlDataReader[0] = " +           mySqlDataReader[0]);         Console.WriteLine("mySqlDataReader[1] = " +           mySqlDataReader[1]);       }       Console.WriteLine(""); // visually split the results     } while (mySqlDataReader.NextResult());     mySqlDataReader.Close();     mySqlConnection.Close();   } } 
end example

The output from this program is as follows:

 mySqlDataReader[0] = 1 mySqlDataReader[1] = Chai mySqlDataReader[0] = 2 mySqlDataReader[1] = Chang mySqlDataReader[0] = 3 mySqlDataReader[1] = Aniseed Syrup mySqlDataReader[0] = 4 mySqlDataReader[1] = Chef Anton's Cajun Seasoning mySqlDataReader[0] = 5 mySqlDataReader[1] = Chef Anton's Gumbo Mix mySqlDataReader[0] = ALFKI mySqlDataReader[1] = Alfreds Futterkiste mySqlDataReader[0] = ANATR mySqlDataReader[1] = Ana Trujillo3 Emparedados y helados mySqlDataReader[0] = ANTON mySqlDataReader[1] = Antonio Moreno Taquería mySqlDataReader[0] = 10248 mySqlDataReader[1] = VINET mySqlDataReader[0] = 10249 mySqlDataReader[1] = TOMSP mySqlDataReader[0] = 10250 mySqlDataReader[1] = HANAR mySqlDataReader[0] = 10251 mySqlDataReader[1] = VICTE mySqlDataReader[0] = 10252 mySqlDataReader[1] = SUPRD mySqlDataReader[0] = 10253 mySqlDataReader[1] = HANAR 

Executing Multiple SELECT, INSERT, UPDATE, and DELETE Statements

You can interleave multiple SELECT, INSERT, UPDATE, and DELETE statements. This can save network traffic because you're sending multiple SQL statements to the database in one go. The following code first creates a SqlCommand object named mySqlCommand and sets its CommandText property to multiple interleaved SQL statements:

 mySqlCommand.CommandText =   "INSERT INTO Customers (CustomerID, CompanyName) "+   "VALUES ('J5COM', 'Jason 5 Company');" +   "SELECT CustomerID, CompanyName " +   "FROM Customers " +   "WHERE CustomerID = 'J5COM';" +   "UPDATE Customers " +   "SET CompanyName = 'Another Jason Company' " +   "WHERE CustomerID = 'J5COM';" +   "SELECT CustomerID, CompanyName " +   "FROM Customers " +   "WHERE CustomerID = 'J5COM';" +   "DELETE FROM Customers " +   "WHERE CustomerID = 'J5COM';"; 

The SQL statements are as follows:

  • The INSERT statement adds a new row to the Customers table.

  • The first SELECT statement retrieves the new row.

  • The UPDATE statement modifies the CompanyName column of the row.

  • The second SELECT statement retrieves the row again.

  • The DELETE statement removes the row.

You can use the same dowhile loop as shown in the previous section to retrieve the two result sets returned by the SELECT statements. The same loop works even though the example executes inter-leaved non-SELECT statements. It works because only the SELECT statements return result sets and the NextResult() method returns true only for the SELECT statements; it returns false for the other SQL statements. Therefore, NextResult() returns false for the INSERT statement and advances to result set for the first SELECT statement, and so on.

Listing 9.5 illustrates how to execute multiple SQL statements.

Listing 9.5: EXECUTEMULTIPLESQL.CS

start example
 /*   ExecuteMultipleSQL.cs illustrates how to execute   multiple SQL statements using a SqlCommand object */ using System; using System.Data; using System.Data.SqlClient; class ExecuteMultipleSQL {   public static void Main()   {     SqlConnection mySqlConnection =       new SqlConnection(         "server=localhost;database=Northwind;uid=sa;pwd=sa"       );     SqlCommand mySqlCommand = mySqlConnection.CreateCommand();     // set the CommandText property of the SqlCommand object to     // the INSERT, UPDATE, and DELETE statements     mySqlCommand.CommandText =       "INSERT INTO Customers (CustomerID, CompanyName) " +       "VALUES ('J5COM', 'Jason 5 Company');" +       "SELECT CustomerID, CompanyName " +       "FROM Customers " +       "WHERE CustomerID = 'J5COM';" +       "UPDATE Customers " +       "SET CompanyName = 'Another Jason Company' " +       "WHERE CustomerID = 'J5COM';" +       "SELECT CustomerID, CompanyName " +       "FROM Customers " +       "WHERE CustomerID = 'J5COM';" +       "DELETE FROM Customers " +       "WHERE CustomerID = 'J5COM';";     mySqlConnection.Open();     SqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader();     // read the result sets from the SqlDataReader object using     // the Read() and NextResult() methods     do     {       while (mySqlDataReader.Read())       {         Console.WriteLine("mySqlDataReader[0] = " +           mySqlDataReader[0]);         Console.WriteLine("mySqlDataReader[1] = " +           mySqlDataReader[1]);       }       Console.WriteLine(""); // visually split the results     } while (mySqlDataReader.NextResult());     mySqlDataReader.Close();     mySqlConnection.Close();   } } 
end example

The output from this program is as follows:

 mySqlDataReader[0] = J5COM mySqlDataReader[1] = Jason 5 Company mySqlDataReader[0] = J5COM mySqlDataReader[1] = Another Jason Company 




Mastering C# Database Programming
Mastering the SAP Business Information Warehouse: Leveraging the Business Intelligence Capabilities of SAP NetWeaver
ISBN: 0764596373
EAN: 2147483647
Year: 2003
Pages: 181

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net