2016-06-16 6 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私はそれが 'text =(reader.GetOntinal(" 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側にあります。私は、別のシステムから引き出し、私が使用している私のアクセスDBにそれをダンプしていたマクロを持っていました。それはもともと10進形式の数値をダンプしていました。私は入ってintに列を更新しましたが、動作しませんでした。

したがって、私はGetIntをGetDecimalに変更しましたが、プログラムの目的上、これは問題にならないでしょう。これにより、元のデータを引き出すときに別のマクロを作成する必要がないように、長期的に時間が節約されます。

ありがとうございました!

関連する問題