2016-06-16 18 views
1

Ich versuche, Daten aus einer Access-Datenbank 2010 zu ziehen. Dies sollte die Lieferantennummer ziehen.Ziehen von Ganzzahlen aus Access-Datenbank mit C#

Ich bekomme zwar eine "ungültige CastException wurde von Benutzercode nicht behandelt. Angegebene Cast ist nicht gültig." wenn ich versuche, das Projekt zu bauen. Ich habe meine Spalte VNNO in meiner Datenbank doppelt überprüft und sie ist auf eine Ganzzahl gesetzt. Ich muss etwas Einfaches vermissen.

public SelectList GetVendors(String selected = "") 
    { 
     IList<SelectListItem> vendors = new List<SelectListItem>(); 
     vendors.Add(new SelectListItem { Text = "", Value = "- Select Vendor -" }); 

     vendors.Add(new SelectListItem { Text = "TO BE ASSIGNED", Value = "TO BE ASSIGNED" }); 

     using (OleDbConnection myConnection = new OleDbConnection(ConfigurationManager.ConnectionStrings["VendorConnection"].ConnectionString)) 
     { 
      myConnection.Open(); 

      using (OleDbCommand command = new OleDbCommand()) 
      { 
       command.CommandText = "SELECT * FROM [MY PPUR301] ORDER BY [VNNO] ASC"; 
       command.Connection = myConnection; 
       command.Prepare(); 

       using (OleDbDataReader reader = command.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         string text = ""; 
         string value = ""; 

         if (!reader.IsDBNull(reader.GetOrdinal("VNNO"))) 
         { 
          text = reader.GetInt32(reader.GetOrdinal("VNNO")).ToString(); 
         } 

         if (!reader.IsDBNull(reader.GetOrdinal("VNNO"))) 
         { 
          value = reader.GetInt32(reader.GetOrdinal("VNNO")).ToString(); 
         } 

         vendors.Add(new SelectListItem { Text = text.ToUpper(), Value = value.ToUpper() }); 
        } 
       } 
      } 
     } 

     return new SelectList(vendors, "Text", "Value", selected); 
    } 

Hier ist ein weiteres Stück Code, das einwandfrei funktioniert. Es zieht den tatsächlichen Namen des Anbieters.

public SelectList GetVendors(String selected = "") 
    { 
     IList<SelectListItem> vendors = new List<SelectListItem>(); 
     vendors.Add(new SelectListItem { Text = "", Value = "- Select Vendor -" }); 

     vendors.Add(new SelectListItem { Text = "TO BE ASSIGNED", Value = "TO BE ASSIGNED" }); 

     using (OleDbConnection myConnection = new OleDbConnection(ConfigurationManager.ConnectionStrings["VendorConnection"].ConnectionString)) 
     { 
      myConnection.Open(); 

      using (OleDbCommand command = new OleDbCommand()) 
      { 
       command.CommandText = "SELECT * FROM [MY PPUR301] ORDER BY [VNNAME] ASC"; 
       command.Connection = myConnection; 
       command.Prepare(); 

       using (OleDbDataReader reader = command.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         string text = ""; 
         string value = ""; 

         if (!reader.IsDBNull(reader.GetOrdinal("VNNAME"))) 
         { 
          text = reader.GetString(reader.GetOrdinal("VNNAME")).ToString().Trim(); 
         } 

         if (!reader.IsDBNull(reader.GetOrdinal("VNNAME"))) 
         { 
          value = reader.GetString(reader.GetOrdinal("VNNAME")).ToString().Trim(); 
         } 

         vendors.Add(new SelectListItem { Text = text.ToUpper(), Value = value.ToUpper() }); 
        } 
       } 
      } 
     } 

     return new SelectList(vendors, "Text", "Value", selected); 
    } 
+0

Was ist die maximale Ganzzahl in Ihrem Datensatz? Ist es möglich, dass Sie Int64 benötigen? –

+1

@Zachary Ich denke, es muss sein "text = (reader.GetInt32 (reader.GetOrdinal (" VNNO "))). ToString();' – Chaitanya

+0

@devlincarnate getestet Int64 auch. Ich glaube, dass max um 8000 ist. –

Antwort

1

Dies ist, wie ich diesen Code schreiben würde:

public static Tortuga.Chain.AccessDataSource DataSource = Tortuga.Chain.AccessDataSource.CreateFromConfig("VendorConnection"); 

public class Foo 
{ 
    public int? VNNO { get; set; } 
    public string VnnoString 
    { 
     get 
     { 
      if (VNNO.HasValue) 
       return VNNO.ToString(); 
      else 
       return ""; 
     } 
    } 
    public string VNNAME { get; set; } 
} 



var items = dataSource.From("MY PPUR301").WithSorting("VNNO").ToCollection<Foo>().Execute(); 

foreach (var item in items) 
{ 
    vendors.Add(new SelectListItem { Text = item.VNNAME.ToUpper(), Value = item.VnnoString }); 
} 
1

Dank @JonathanAllen für seine Hilfe! Es ist definitiv auf der DB-Seite der Dinge. Ich hatte ein Makro, das von einem anderen System zog und es in meine Access DB, die ich verwende, ablegte. Ursprünglich wurden dezimale Zahlen ausgegeben. Ich ging hinein und aktualisierte die Spalte zu int, aber es funktionierte nicht.

Daher habe ich nur meine GetInt in GetDecimal geändert und für den Zweck des Programms wird dies nichts schaden. Dies spart auf lange Sicht Zeit, so dass ich beim Ziehen der Originaldaten kein weiteres Makro erstellen muss.

Danke an alle für die Hilfe!