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のブロック終了時に接続が自動的に閉じられます。

参考

Last updated