2017-10-28 5 views
0

Die Tabelle in SQL Server hinzufügen, die ich versuche, Daten zu extrahieren aus hat die folgenden Spalten:eine NotSupportedException beim Versuch, ein Objekt zu einer Liste

Namen | Geschlecht | Gehalt | Abteilung

Im folgenden Code versuche ich nur, Mitarbeiterinformationen aus einer Tabelle zu extrahieren, ein Mitarbeiterobjekt aus diesen Informationen zu erstellen und dieses Objekt dann zu einer Liste von Mitarbeitern hinzuzufügen. Hier ist der Code:

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() { } 
     } 
    } 

Wenn ich den obigen Code im Debug-Modus (in Visual Studio) laufen, die Code bricht und der folgende Code wird gelb markiert:

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

Was ist die genaue Ausnahme Nachricht & innere Ausnahmemeldung, die Sie bekommen? Und was sind die Spaltenarten in der Ergebnismenge, die Sie von der Abfrage 'SELECT * FROM employees' erhalten? – Shyju

+0

Sie könnten die Mitarbeiter leichter in eine DataTable laden. Wenn Sie 'SELECT *' wählen, steuern Sie nicht wirklich, in welcher Reihenfolge die Spalten zurückkommen. Sie könnten versuchen, ein Datum über 'GetInt16()' zu bekommen – Plutonix

Antwort

0

Vor allem Sie sollte überprüfen, ob Zeilen im Ergebnis vorhanden sind. mit diesem Code können Sie das überprüfen:

if (reader.HasRows) 

Sie können System.NotSupportedException oder System.InvalidCastException, wenn die Gestaltung der Mitarbeitertabelle und Ihre Mitarbeiter Objekt unterscheiden und Sie versuchen, eine ungültige Guss- oder wenn gab es keine Daten in Ihr Ergebnis Sie erhalten eine System.NotSupportedException.

ich einige Verbesserungen im Code gemacht und diese Arbeit werden soll:

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() 
        } 
       ); 
      } 
     } 
    } 
} 

einfach den Code darüber Ihren wenn Block (nach dieser Zeile) Kopieren:

if (SQLConnectingTools.CheckConnection(connectionString)) 
Verwandte Themen