• 締切済み

「指定されたキャストは有効ではありません。」とエラーが出てしまいます。

開発環境VisualStudio.NET 開発言語C#です。 データベースに接続しデータを取り出すコードの一部ですが「指定されたキャストは有効ではありません。」と表示されます。 while( sqlReader14.Read() ) { int empTD2 = (int)sqlReader14["LineNumber"]; if(empTD2 == time) { int empFD = (int)sqlReader14["DepartureTimeInt"]; int empED = (int)sqlReader14["ArrivalTimeInt"]; string empFFD = sqlReader14["DepartureTime"].ToString(); string empEED = sqlReader14["ArrivalTime"].ToString(); if(950 >= ViaTime) { TimeGet4 = empFFD; TimeGet5 = empEED; goto Labelc; } } } Labelc:; 実行しソフトを操作するとint empFD = (int)sqlReader14["DepartureTimeInt"];でエラーが発生しタイトルのようなメッセージが出ます。いろいろ試行錯誤しましたが解決しません。どうかよろしくお願いします。

みんなの回答

  • lawson
  • ベストアンサー率44% (29/65)
回答No.2

sqlReader14["DepartureTimeInt"].GetType().ToString() の内容を実行時に、デバッガで、調べましょう。 そして、本当にint型でのキャストでよいのか 調べましょう。 sqlReader14[ の内部で例外が発生しているケースでは、 No1さんのような対策をしてください。 本当にNo1さんの対策でよいのかを調べるために sqlReader14.IsDBNull(●) の部分の評価値のbool値をデバッガで 実行時で除いてみましょう。 開発対象のシステムでのDBから取得される型 がint, string, DateTimeなどに限定されるようで あれば、IsDBNullのチェックおよび、 .GetType().ToString()の型の判定や、 データの取得ロジックなどの共通化を 検討しましょう。 リフレクションや、VS2005以降のGeneric等を 用いて自動的に、Beanに結果が格納されるような もちろん、今回の質問事項も解決されて、吸収された フレームワークを作ってしまいましょう。 以上。

  • 7marine
  • ベストアンサー率36% (59/160)
回答No.1

sqlReader14["DepartureTimeInt"]がnullである可能性があります int empFD; if (!sqlReader14.IsDBNull(●)){ empFD = (int)sqlReader14["DepartureTimeInt"]; } などの対策が必要です

関連するQ&A

  • C キャスト方法を教えてください

    C言語の初心者なのですが、 int abc(int(*read)(void*, int, int), int size, char* data); ような関数で第1引数の値をキャストするときどうすればよいですか。   int read = (????)NULL; そもそもint(*read)(void*, int, int)ってどういう意味ですか?

  • VB.NET SQL SERVER COMPACT EDITION2

    VB.NETにてWindowsMobile5.0の開発をしております。 SQL SERVER COMPACT EDITIONを使ってデータベースの開発に取り掛かっておりますが経験が全くなく非常に手こずってます。 下記のようにリストボックスへ列の1要素を表示させます。 While dtr.Read() Dim lb As String lb = dtr("TNAME").ToString() LB_TEN.Items.Add(lb) End While リストボックスで要素の一つが選択されるとその要素の関連項目をテキストボックスに表示させるプログラムを組みたいのですがどうすればよいのでしょうか? LB_TEN.SelectedIndexで選択された要素を取得しRead()でデータベースから引き出すと言う方法を考えましたがイマイチRead()の使い方が分かりません。 ほかにいい方法があるのでしょうか? ご教授のほどよろしくお願いします。 年末までに仕上げなければならず非常に困ってます。 どうかお助けて下さい。

  • 文字列の加算

    OS  :WindowsXP Pro SP1 開発環境:VisualStudio .NET 2003 開発言語:C# 開発形態:Windowsアプリケーション プログラミング初心者です。どうかよろしくお願い致します。 現在、あるアプリケーションを作成しております。 その中で、数値の入った文字列を受け取り、それを全て加算しようとしております。 例えば、 引数の文字列が"123456789"だとしたら、そのメソッド内で1+2+3+4+5+6+7+8+9を計算し、答えを返却値とする。 私は文字列をint型にキャストして計算しようと思ったのですが、うまくキャストできません。string型はint型にキャストできないのでしょうか? また他に文字列の数値の加算をする方法がありましたら、どなたかご教授お願い致します。

  • スレッド動かず

    本の真似をして、スレッドを書いてみたんですがに何も起こりませんでした。全く分かりません。どうすれば良いでしょうか? public class Frame1 extends Frame implements Runable{ ................. ................. Thread kick = new Thread(this); int time; public void start() { if (kick ==null) kick.start(); } public void run() { while (kick == Thread.currentThread()) { time++; String s = Integer.toString(time); textArea1.append( s + "\r\n"); try{ Thread.sleep(1000); }catch(InterruptedException e){} } }

    • ベストアンサー
    • Java
  • javaの不思議

    C言語をたしなむ程度にやっているものです。 Javaを勉強していたのですが、不思議だなと思ったので質問させてください。 Integer value = new Integer(30); value.doubleValue() // <- double型に変換している このプログラムだとvalueはintなのにあらかじめdoubleに変換できることを想定しています。 C言語の癖なのかしらないですが、型変換をするならクラスメソッドではなくキャストするか、 メソッドに投げる(Integer.toString←stringにする例ですが)。 この2つの方法が自然な型変換だと思うのですが、変でしょうか?

    • ベストアンサー
    • Java
  • どこがエラーか確認してください…

    プログラムを作ったのですが、さまざまなエラーが出てしまいます。 与えた引数を数字と文字にわけるというプログラムです。 public class Selection { private static final char[] nch = { '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' };//0から9までの数字をchar型配列要素として定義 public static String numbersonly(String inputstr) { StringBuffer bfn = new StringBuffer(); for (int i = 0 ; i < inputstr.length(); i++) { for (int j = 0;j < nch.length() ; j++) { if(inputstr.charAt(i) == nch[j]) bfn.append(inputstr.substring(i)); //bfnにinsputstrのi番目の文字を付け足す } } return; bfn.toString(); //bfnをstring型に変えて戻り値 } //numbersonlyメソッドの場合と同様に以下も補う public static String lettersonly(String inputstr) { StringBuffer bfn =new StringBuffer(); boolean let; for (int i = 0; i < inputstr.length(); i++) { let = true; for(int j = 0; j < nch.length(); j++) { if(inputstr.charAt(i) == nch[j]) let =false; } if (let)bfn.append(inputstr.substring(i)); } return;bfn.toString(); } } はじめのchar型配列要素として定義するところでシンボルを解決できません、となっているので、そのほかのnchを使う部分(lengthメソッド、戻り値)にも影響が出ているのか、jのlengthメソッドもどちらともシンボル解決できず、それぞれreturnでは戻り値がありません、となります。

    • ベストアンサー
    • Java
  • C言語で簡単暗号

    C言語を初めてけっこう立つんですが。 自分なりにソフトを作ってみました 暗号化、解読ができるソフトです 1.暗号化 2.解読 3.Quit ソースは #include <stdio.h> int main(void) { int i; char da; back: modo: do{ printf("1.angouka\n"); printf("2.kaidoku\n"); printf("3.Quit\n"); scanf("%d",&i); }while(i<1 || i>3); if(i==1){ da=getchar(); while(da){ printf("%c",da+1); da=getchar(); if(da=='.'){ goto modo; } } } else if(i==2){ da=getchar(); while(da){ printf("%c",da-1); da=getchar(); if(da=='.'){ goto back; } } } return 0; } なんですが。感想などここはこうした方が良いなどと教えてもらいたいんですが。 もっと簡潔にかけて破かれにくい暗号を書くにはどうしたらいいでしょう 教えて下さい

  • C# Session情報からのキャストについて。

    キャストについて質問させて下さい。 C# FormViewでWebフォームを開発しております。 フォームに「カテゴリ」というDropDownListの項目があります。 入力画面を開いた際に、以下のようにSession情報から「カテゴリ」をデフォルト選択状態にしたいです。 ------ protected void Page_PreRenderComplete(object sender, EventArgs e) {    if (Session["Session_Category"] != null)    {       int Session_Category = (int)Session["Session_Category"];       ((DropDownList)FormView1.FindControl("CategoryDropDownList")).SelectedIndex = Session_Category;    } } ------ しかし実行すると、 「int Session_Category = (int)Session["Session_Category"];」の部分で 「指定されたキャストは有効ではありません。」とエラーが出ます。 キャストという事で、大変初歩的なエラーかと恐縮ではありますが、 対処方法をアドバイス頂けないでしょうか? わたくは、SessionとはObject型と認識しておりますが、 どうやったらInt型に変換できるでしょうか? 混乱してきました。 ちなみに、 ・Session["Session_Category"]の値は、必ず1,2,3,4のいずれかの数値が格納されております。 ・「using System.Web.SessionState;」は挿入しております。

  • キャスト方法について

    C言語にてbase64デコード処理を行う独自の関数を作成することになり putcを使用して出力するソース(以下)はあるのですが、 charの配列にデコード結果を上手く格納することができません。 何か良い方法はありませんでしょうか? int main(int argc, char **argv, char **envp) { FILE *fpin, *fpout; int c, i = 0; unsigned char buffer[4]; if( argc < 2 ){ fpin = stdin; } if( argc < 3 ){ fpout = stdout; } else if(( fpout = fopen(argv[2],OPENMODE)) == NULL ){ return 8; } while(( c = getc(fpin) ) != EOF ){ if( c >= 'A' && c <= 'Z' ){ buffer[i++] = c - 'A'; } else if( c >= 'a' && c <= 'z' ){ buffer[i++] = c + 26 - 'a'; } else if( c >= '0' && c <= '9' ){ buffer[i++] = c + 52 - '0'; } else if( c == '+' ){ buffer[i++] = 62; } else if( c == '/' ){ buffer[i++] = 63; } if( i >= 4 || ( i >= 0 && c == '=' )){ putc( ( buffer[0] << 2 ) | ( buffer[1] >> 4 ), fpout); if( i >= 3 )putc( ( buffer[1] << 4 ) | ( buffer[2] >> 2 ), fpout); if( i >= 4 )putc( ( buffer[2] << 6 ) | buffer[3], fpout); i = 0; } } }

  • エラー処理について

    ファイルを引数に取って、そのファイルの中身を文字列として返す自作メソッドをウェブで見つけたので、そのまま使用しようと思いました。しかし、ファイルが空ファイルの場合はこのメソッドだとエクセプションエラーになってしまうようです。どこかを変更して、メイン側で適切に処理してあげなければならないと思われるのですが、どこをどう修正すればよいでしょうか。自分で作成したものでもないので、見当がつかない状態です。。申し訳ありませんが宜しくお願いします。 public static String fileToString(File file) throws IOException { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); StringBuffer sb = new StringBuffer(); int c; while((c=br.read())!=-1) { sb.append((char) c); } return sb.toString(); } finally { br.close(); } }

    • ベストアンサー
    • Java