2016-06-16 1 views
1

2010 Access 데이터베이스에서 데이터를 가져 오려고합니다. 이것은 공급 업체 번호를 가져와야합니다.C#으로 액세스 데이터베이스에서 정수 가져 오기

"잘못된 CastException이 사용자 코드에 의해 처리되지 않았습니다. 지정한 캐스트가 유효하지 않습니다." 내가 프로젝트를 만들려고 할 때. 나는 내 데이터베이스에서 VNNO 열을 두 번 확인했으며 정수로 설정되었습니다. 나는 간단한 것을 놓치고 있어야합니다.

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

다음은 결함없이 작동하는 또 다른 코드입니다. 공급 업체의 실제 이름을 가져옵니다.

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

데이터 세트의 최대 정수는 얼마입니까? Int64가 필요할 수도 있습니까? –

+1

@ Zachary 필자는 텍스트 = (reader.GetInt32 (reader.GetOrdinal ("VNNO"))) .ToString(); ' – Chaitanya

+0

@devlincarnate가 Int64도 테스트했는지 확인해야한다고 생각합니다. 최대 값은 약 8000입니다. –

답변

1

이것은 내가 그 코드를 작성하는 것이 방법이다 : 그의 도움을 @JonathanAllen에

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

감사합니다! 확실히 DB쪽에 있습니다. 다른 시스템에서 가져온 매크로를 사용하고있는 Access DB에 덤프했습니다. 그것은 원래 10 진수 형식의 숫자를 덤핑했습니다. 내가 들어가서 int로 컬럼을 업데이트했지만 작동하지 않았다.

따라서 GetInt를 GetDecimal로 변경 했으므로 프로그램의 목적 상 이로 인해 문제가 발생하지 않습니다. 장기간에 걸쳐 시간을 절약 할 수 있으므로 원본 데이터를 가져올 때 다른 매크로를 만들 필요가 없습니다.

도움을 주신 모든 분들께 감사드립니다!

관련 문제