none
VBコードをC#コードにコンバートしたい RRS feed

  • 質問

  • 以前に大変お世話になりましたze73ともうします。
    ACCESSからSQL Serverに乗り換えたのを機会にデータベースの勉強をやり直そうとして、「ひと目でわかるVisual Basic 2008 データベース開発入門」を読み始めたところです。
    本当はC#での解説本を探したのですがないものですから、無謀にもVB→C#に書き換えて読もうとしています。
    Private Sub rdbMale_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdbMale.CheckedChanged
            '男性のラジオボタンが選択されていない場合には以降の処理を中止する
            If rdbMale.Checked() = False Then Return
    
            'バインディングソースから現在のデータを取得する
            Dim drv As DataRowView = Me.Tbl_staffBindingSource.Current
            'Null値または男性以外の場合には男性の値(1)をセットする
            If IsDBNull(drv("staff_sex")) OrElse drv("staff_sex") <> 1 Then
                drv("staff_sex") = 1
            End If
    
        End Sub
    上のVBコードをC#で書き換えてみたのですが、
    private void rdbMale_CheckedChanged(object sender, EventArgs e)
            {
                //男性のラジオボタンが選択されていない場合には以降の処理を中止する 
                if (!rdbMale.Checked) return;
    
                //バインディングソースから現在のデータを取得する 
                DataRowView drv = (DataRowView)this.tbl_staffBindingSource.Current;
                //Null値または男性以外の場合には男性の値(1)をセットする 
                if (drv["staff_sex"] == System.DBNull.Value || drv["staff_sex"] != "1")
                {
                    drv["staff_sex"] = 1;
                } 
    
            }
    drv["staff_sex"] != "1" のところで、

    「予期しない参照比較です。比較値を取得するには型'string'に左辺をキャストしてください」
    とのエラーになってしまいます。
    (string)などを試してみましたがだめでした。どのように書くのが正しいのでしょうか、お教え願います。

    (併せて)Freeで、比較的に高性能のコンバーターをご紹介いただけませんでしょうか。




    zen73
    2009年7月7日 1:37

回答

  • ブレークポイントを各所の staff_sex 列取得箇所に置いて、drv["staff_sex"] にどんな型のどんな値が入っているのか確認してみてください。
    • 回答としてマーク zen73 2009年7月7日 21:26
    2009年7月7日 11:20
  • CheckedChangedイベントはフォームが表示される際にも発生しているはずです。つまり、フォームが表示される際に何度かCheckedChangedイベントハンドラが実行されていることになります。ブレークポイントを設定した際に何度かCheckedChangedイベントハンドラが実行されていませんでしたでしょうか? もしそうであれば、最初はdrv["staff_sex"] がまだnullなのかもしれません。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク zen73 2009年7月8日 3:16
    2009年7月8日 0:21
    モデレータ

すべての返信

  •             if (drv["staff_sex"] == System.DBNull.Value || drv["staff_sex"] != "1")

    drv["staff_sex"] はobject型ですから、

    drv["staff_sex"] .ToString() として、string型にcastする必要があります。
    2009年7月7日 2:19
  • ToString はキャストじゃありません。そのオブジェクトの文字列表現を取得するメソッドです。

    で、staff_sex 列には int 型のデータを格納してるみたいですから、int にキャストしてやればいいんじゃないでしょうか。
    (int)drv["staff_sex"]

    "1" と 1 は、文字列= String 型 (string) と数値= Int32 型 (int) で全く別のものです。ちゃんと区別しましょう。
    • 回答としてマーク zen73 2009年7月7日 7:56
    • 回答としてマークされていない zen73 2009年7月7日 9:23
    2009年7月7日 2:29
  • (併せて)Freeで、比較的に高性能のコンバーターをご紹介いただけませんでしょうか。

    ソース レベルのコンバーターではないですが、「.NET Reflector」というものがあります。

     .NET Reflector, class browser, analyzer and decompiler for .NET
     http://www.red-gate.com/products/reflector/

    VB ソースを一旦コンパイルして、出来上がったアセンブリを元に C# ソースを生成することができます。
    VB と C# を比較して学習するのが目的と思われますので、VB ソースがどのように C# ソースで表現されるかの参考になると思います。
    2009年7月7日 2:41
  • (併せて)Freeで、比較的に高性能のコンバーターをご紹介いただけませんでしょうか。

    私が知ってるのは以下ぐらいです・・・

    Code Translation for .NET (C#<->VB.NET)
    http://www.carlosag.net/Tools/CodeTranslator/

    Convert VB.NET to C#
    http://www.developerfusion.com/tools/convert/vb-to-csharp/

    Convert VB.NET to C#
    http://www.dotnetspider.com/convert/Vb-To-Csharp.aspx


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク zen73 2009年7月7日 9:22
    • 回答としてマークされていない zen73 2009年7月7日 9:23
    2009年7月7日 3:23
    モデレータ
  • GX999さん、hongliangさん、totojoさん、trapemiyaさんありがとうございました。

    (「.NET Refrector」の使用法がまったくわかりません、素人が使いこなせるようなものではないのでしょうね)
    zen73
    2009年7月7日 8:03
  • staff_sex 列には int 型のデータを格納しています。

    Hongliangさんに教えていただいた
         (int)drv["staff_sex"]
    でデバッグしてみましたら、
         「指定されたキャストは有効ではありません」
    とのエラーがでてしまいました。それで何気なしに、
         int.Parse(drv["staff_sex"].ToString())
    としてみましたら、エラーが出ませんでした。

    しかし、2つの疑問があります。
    1)rdbmaleとrdbfemaleの2つのラジオボタンがあるのですが、
    上記のデバック時エラーはrdbmaleでのこと。rdbFemaleのCheckedChangedイベントもまったく同じコードなのに
    (int)drv["staff_sex"] がエラーにならないのはなぜでしょうか。
    2)object型→文字型→整数型としているのですが、object型→整数型とする方法はないのでしょうか。

    *ここでも・・・
    switch(int.Parse (drv["staff_sex"].ToString ()))
    {
          case 1:

          case 2:

    }



          


    zen73
    • 回答としてマーク zen73 2009年7月7日 21:27
    • 回答としてマークされていない zen73 2009年7月7日 21:27
    2009年7月7日 10:16
  • ブレークポイントを各所の staff_sex 列取得箇所に置いて、drv["staff_sex"] にどんな型のどんな値が入っているのか確認してみてください。
    • 回答としてマーク zen73 2009年7月7日 21:26
    2009年7月7日 11:20
  • Hongliangさん、何度もありがとうございます。

    どこでも、
       drv["staff_sex"]  型: Object{byte} 値: 1 or 2
    となっており、それぞれの箇所での違いがよくわからないのですが、「動けばよい」ということで、先を読み進めていこうと思います。


    zen73
    • 回答としてマーク zen73 2009年7月8日 4:57
    • 回答としてマークされていない zen73 2009年7月8日 4:57
    2009年7月7日 21:40
  • CheckedChangedイベントはフォームが表示される際にも発生しているはずです。つまり、フォームが表示される際に何度かCheckedChangedイベントハンドラが実行されていることになります。ブレークポイントを設定した際に何度かCheckedChangedイベントハンドラが実行されていませんでしたでしょうか? もしそうであれば、最初はdrv["staff_sex"] がまだnullなのかもしれません。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク zen73 2009年7月8日 3:16
    2009年7月8日 0:21
    モデレータ
  • CheckedChangedイベントはフォームが表示される際にも発生しているはずです。つまり、フォームが表示される際に何度かCheckedChangedイベントハンドラが実行されていることになります。ブレークポイントを設定した際に何度かCheckedChangedイベントハンドラが実行されていませんでしたでしょうか? もしそうであれば、最初はdrv["staff_sex"] がまだnullなのかもしれません。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/

    trapemiyaさん、ありがとうございます。
    「最初はdrv["staff_sex"] がまだnullなのかもしれません。」
    ご指摘のとおりです。これで疑問が解消されました。

    65歳になりましたが、以前に教えていただいて完成させた「会計簿」の機能充実を図ろうとして、データベースの勉強をやりなおしているところです。これからもよろしくご教示のほど、よろしくおねがいします。

    zen73
    2009年7月8日 3:16