SQL Serverへの接続(回答)

回答

  • A. 12行目に次のコードを挿入する。 : sqlConnection.Open();

  • D. 15行目に次のコードを挿入する。 : while(sqlDataReader.Read())

01 class Car
02 {
03 public string Color { get;set; }
04 public string Name { get; set; }
05 }
06 private static IEnyumerable<Car> GetCars(string sqlConnectionString)
07 {
08 var cars = new List<Car>();
09 using (sqlConnection = new SqlConnection(sqlConnectionString))
10 {
11 SqlCommand sqlCommand = new SqlCommand("SELECT Name, ColorName FROM Cars", sqlConnection);
12 sqlConnection.Open();
13 using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
14 {
15 while(sqlDataReader.Read())
16 {
17 var car = new Car();
18 car.Name = (string)sqlDataReader["Name"];
19 car.Color = (string)sqlDataReader["ColorName"];
20 cars.Add(car);
21 }
22 }
23 }
24 return cars;
25 }

解説

SqlConnectionクラスでは、接続をする際には最初にOpenメソッドを呼び出す必要があります。

通信を終了してSqlConnectionが不要になった場合には、Closeメソッドを呼び出しますが、問題のようにusingを使用している場合には、usingのブロック終了時に接続が自動的に閉じられます。

次に、SqlCommandクラスのExecuteReaderメソッドでSqlDataReaderオブジェクトを取得しています。

そして、SqlDataReaderオブジェクトを使って取得しか結果の値を取り出しますが、ここではReadメソッドとwhileを使うことで最後までデータを取得するようになっています。

Readメソッドの戻り値は、次の行が存在する場合にはtrue、それ以外の場合はfalseが返されるため、それをwhileで利用することによって繰り返し処理が可能になっています。

同じようなメソッドとしてNextResultメソッドがありますが、こちらはバッチ Transact-SQL ステートメントの結果を取得する際に使用するものですので、ここでは適切ではありません。

SqlDataReaderにも、終了するためにCloseメソッドがありますが、SqlConnectionと同様にusingを使用している場合には、usingのブロック終了時に接続が自動的に閉じられます。

参考