2017-10-28 15 views
0

SQL Serverのデータを抽出しようとしているテーブルには、次の列があります。リストにオブジェクトを追加しようとするとNotSupportedExceptionが発生する

name |性別|給料| department

以下のコードでは、テーブルから従業員情報を抽出し、その情報から従業員オブジェクトを作成し、そのオブジェクトを従業員のリストに追加するだけです。ここで コードです:

namespace LINQQueriesPart2 
{ 
    class Program 
    { 
     List<Employee> whatever = EmployeeDB.getEmployees(); 

     IEnumerable<Employee> query = from y in whatever 
             where y.name[0] == 'M' 
             select y; 

     foreach (Employee x in query) 
     { 
      Console.WriteLine(x.name); 
     } 
    } 
} 

namespace ConnectingToSql 
{ 
    public static class EmployeeDB 
    { 
     public static List<Employee> getEmployees() 
     { 
      List<Employee> returnList = new List<Employee>(); 

      String connectionString = "server=DESKTOP-T5KDKOP;" 
            + "database=MCP_Exam_70-483_Prep;" 
            + "Trusted_Connection=yes"; 

      if (SQLConnectingTools.CheckConnection(connectionString)) 
      { 
       SqlConnection connection = new SqlConnection(connectionString); 
       connection.Open(); 
       SqlCommand command = new SqlCommand("SELECT * FROM employees", connection); 

       SqlDataReader reader = command.ExecuteReader(); 
       while (reader.Read()) 
       { 
        returnList.Add(
         new Employee 
         { 
          name = reader.GetString(0), 
          gender = reader.GetChar(1), 
          salary = reader.GetInt16(2), 
          department = reader.GetString(3) 
         } 
        ); 
       } 
       reader.Close(); 

       connection.Close(); 
      } 
      else 
      { 
       Console.WriteLine("SQL connection is not successful."); 
      } 
      return returnList; 
     } 
    } 

    public class Employee 
    { 
     public String name { get; set; } 
     public char gender { get; set; } 
     public int salary { get; set; } 
     public String department { get; set; } 

     public Employee() { } 
     } 
    } 

私は(Visual Studioで)デバッグモードで上記のコードを実行すると、コードブレークし、次のコードは、黄色の強調表示されています:すべての

returnList.Add(
    new Employee 
    { 
     name = reader.GetString(0), 
     gender = reader.GetChar(1), 
     salary = reader.GetInt16(2), 
     department = reader.GetString(3) 
    } 
);' 
+0

正確な例外では何メッセージ&内部例外メッセージを取得していますか?そして、SELECT * FROM employeesクエリから取得した結果セットの列の種類は何ですか? – Shyju

+0

従業員をDataTableに簡単に読み込むことができます。つまり、 'SELECT *'を指定すると、列がどのような順序で戻ってくるかを実際は制御できません。 'GetInt16()'で日付を取得しようとしている可能性があります。 – Plutonix

答えて

0

まず、あなたが結果に行が存在するかどうかを確認する必要があります。このコードで あなたはそれをチェックすることができます。

if (reader.HasRows) 

employeeテーブルの設計とあなたのEmployeeオブジェクトが異なる場合は、System.NotSupportedExceptionまたはSystem.InvalidCastExceptionのを得ることができ、あなたは無効なキャストを試すかにデータがなかった場合あなたの結果System.NotSupportedExceptionが発生します。

私はあなたのコード内でいくつかの改善がなされ、これは作業する必要があります。

using (SqlConnection cn = new SqlConnection(connectionString)) 
{ 
    string commandText = "SELECT * FROM employees"; 
    using (SqlCommand cmd = new SqlCommand(commandText, cn)) 
    { 
     cmd.CommandText = commandText; 

     cn.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 
     if (reader.HasRows) 
     { 
      while (reader.Read()) 
      { 
       var employeeColumns = new object[4]; 
       var colCount = reader.GetSqlValues(employeeColumns); 
       returnList.Add(
        new Employee 
        { 
         name = employeeColumns[0].ToString(), 
         gender = employeeColumns[1].ToString()[0], 
         salary = Convert.ToInt16(employeeColumns[2].ToString()), 
         department = employeeColumns[3].ToString() 
        } 
       ); 
      } 
     } 
    } 
} 

だけをコピーし、それ以上のコードお使いの場合はブロック(この行の後):

if (SQLConnectingTools.CheckConnection(connectionString)) 
関連する問題