none
ハンドルされていない例外が RRS feed

  • 質問

  • Imports System.Data.SqlClient
    Public Class Form3
        Private cn As New SqlConnection()
        Private cmd As New SqlCommand()
        Private rd As SqlDataReader
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            cn.ConnectionString =
                "data source=(LocalDB)\v11.0;" &
                "AttachDbFilename=|DataDirectory|\database1.mdf;" &
                "Integreted security=True;connect timeout=30"
            cn.Open()

            cmd.Connection = cn
            cmd.CommandType = CommandType.Text
            cmd.CommandText = "DELETE FROM [dbo].[Table]" &
                "WHERE Id='" & TextBox1.text & "'"
            rd = cmd.ExecuteReader
            rd.Close()
            cn.Close()
        End Sub
    End Class

    このようにソースを記述して実行すると、

      cn.ConnectionString =
                "data source=(LocalDB)\v11.0;" &
                "AttachDbFilename=|DataDirectory|\database1.mdf;" &
                "Integreted security=True;connect timeout=30"

    の部分が色でおおわれ「ハンドルされていない例外が」と表示されデバッグが中止されます。問題がよくわからないのですが、どこに支障があるのでしょうか。



    2014年6月15日 14:29

回答

  • 先週の質問で正しく修正されたはずですが、また、つづりの間違いです。
    Integreted Security -> Integrated Security

    cn.ConnectionString =
        "data source=(LocalDB)\v11.0;" &
        "AttachDbFilename=|DataDirectory|\database1.mdf;" &
        "Integrated Security=true;connect timeout=30"

    「ハンドルされていない例外が」と質問に書いてありますが、エラーが発生したときにはもっとたくさんの情報が表示されているはずです。
    「ハンドルされていない例外」という言葉はエラーが発生したときにはほぼいつも表示される文言なので、エラーの内容を判断するにはあまり意味のない情報です。これ以外の言葉に注目することで何が間違っているのかの手がかりになります。

    たとえば、今回の例では「追加情報:キーワードはサポートされていません : 'integreted security'」と表示されています。このことから、「integreted security」に何か間違いがあるのではないかと目安がつきます。

    プログラムをしていれば今後も多くのエラーに遭遇するでしょうが、表示されているエラー情報をよく見るようにしましょう。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2014年6月16日 0:53
    • 回答としてマーク bentensama 2014年6月20日 5:30
    2014年6月15日 15:03

すべての返信

  • 先週の質問で正しく修正されたはずですが、また、つづりの間違いです。
    Integreted Security -> Integrated Security

    cn.ConnectionString =
        "data source=(LocalDB)\v11.0;" &
        "AttachDbFilename=|DataDirectory|\database1.mdf;" &
        "Integrated Security=true;connect timeout=30"

    「ハンドルされていない例外が」と質問に書いてありますが、エラーが発生したときにはもっとたくさんの情報が表示されているはずです。
    「ハンドルされていない例外」という言葉はエラーが発生したときにはほぼいつも表示される文言なので、エラーの内容を判断するにはあまり意味のない情報です。これ以外の言葉に注目することで何が間違っているのかの手がかりになります。

    たとえば、今回の例では「追加情報:キーワードはサポートされていません : 'integreted security'」と表示されています。このことから、「integreted security」に何か間違いがあるのではないかと目安がつきます。

    プログラムをしていれば今後も多くのエラーに遭遇するでしょうが、表示されているエラー情報をよく見るようにしましょう。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2014年6月16日 0:53
    • 回答としてマーク bentensama 2014年6月20日 5:30
    2014年6月15日 15:03
  • bentensama さま よろしく。

    gekka さまご指摘のミススペル以外にも、直ぐ、次の壁が待っていそうですね。

    ExecuteReader は その名の如く データの取得で使い、
    削除などでは cmd.ExecuteNonQuery を使います。
    双方をヘルプで、若しくは Internet 検索で調べてみましょう。

    • 回答の候補に設定 星 睦美 2014年6月16日 0:53
    2014年6月15日 15:20
  • 星睦様、よろしくお願いします。Excutereaderを変更してExecuteNonQueryにしますと青い波下線が付き、「型Integerの値を、System.Data Sqlclient Readerに変換できません」と出ます。これは何を意味しているのでしょうか。このフォームについているボタンはテキストボックスに数値を入力して、クリックすると、別のフォームのリストボックス上にに消去されたデーターを除いたデータが表示されるものです。
    2014年6月17日 11:40
  • あなたの対応が常識外にひどいので一言・・・

    あなたが回答をもらったのは星さんではなくて、gekka さんと ShiroYuki_Mot さんです。わかってますか?

    2014年6月17日 12:17
  • SurferOnWww さま フォローありがとうございます。
                   拝見して、大声で笑っていたら、同居人に睨まれてしまいました。 脱線。

    bentensama さま 拝見しました。

    私の投稿は読んで戴けましたか。 ExecuteNonQuery は調べて見ましたか。
    単に一箇所、cmd.ExecuteReader を cmd.ExecuteNonQuery に変えたのでは動きません。
    調べる事で、身につくものです。 頑張って!
    2014年6月17日 14:27
  • やり取はとりあえず置いといて、もう少し技術的なフォローが必要だと思いましたので、ShiroYuki_Motさん、少し補足させて下さい。

    >「型Integerの値を、System.Data Sqlclient Readerに変換できません」と出ます。これは何を意味しているのでしょうか。

    まず、Visual Basicが含まれる.NETでは、コンパイル時に型に矛盾がないか調査されます。例えば、DateTime型の変数に、String型の文字列"ワールドカップ"は代入できません。"ワールドカップ"が日時ではないことから明らかなので、この例を理解するのは容易いと思います。「型Integerの値を、System.Data Sqlclient Readerに変換できません」
    も、実は全く同じことです。ただ、型が変っただけです。例ではString型の値をDateTime型の変数に代入することができませんでしたが、このエラーが意味しているのは、Integer型の値を「System.Data Sqlclient Reader」型に代入できないということです。
    実際には「変換できません」という言葉が使われていますが、Visual Basicはコンパイル時に型が違うもの同士の代入があれば、できるだけがんばって変換して代入しようとしますが、今回はがんばっても無理だったのでこのエラーを発しています。

    ところでなぜInteger型が突然出てきたのかおそらく理解されていないと思うのですが、そこはShiroYuki_Motさんから宿題が出ていますので、調べてみて下さい。MSDNを見ればサンプルコードも載っているはずです。

    #.NETはこのようにコンパイル時に型同士の矛盾がチェックされます。よって、コンパイル後には型矛盾がないことになります。これをタイプセーフと呼びます。この辺りの理解が不足していると思われますので、この辺りも調べてみて下さい。関連して、キャストの意味がわからなければ、これについても調べてみて下さい。

    #System.Data Sqlclient Reader型は、おそらくSqlDataReader型です。念のために述べておきますが、前についているSystem.Data.SqlClientは名前空間を表します。

    #掲載されたコードを修正されて動作しても、いくつかまずい点がありますので、動作してよかったとそのままにしないようにして下さい。まずは動作することを優先した方がよいと思いますので、まずい点については後で述べたいと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 編集済み trapemiyaModerator 2014年6月18日 1:19 名前空間にピリオド追加等
    2014年6月18日 1:16
    モデレータ
  • bentensama さま 補足します。

    trapemiya さま、フォローありがとうございます。
    でも、きっと、初学者の方は、余計、分んなくなっちゃうのかなぁと。 特に後半。
    bentensama さま そのうち、trapemiya さまの仰った事が分る時が来ると思います。

    私の最初の書き方が悪かったのでしょうね。言い直してみます。

    取得時と、訂正・挿入・削除時とでは、基本的な書き方が変わります。
    単に一箇所を変えたのでは動きません とは、何箇所か変えないと駄目という事です。
    取得は Excutereader、その他は ExecuteNonQuery ですね。
    最初のご質問で書かれた Private rd As SqlDataReader は Excutereader を使うよ って事ですね。
    これがヒントです。
    「vb.net Excutereader ExecuteNonQuery」で、Net 検索して見て下さい。
    VB.net + ADO.net - プログラミング色々 というのが、そのものズバリではありませんが、
    参考になりそうです。

    因みに、実際に検索してみると、なかなかよい答えがないのでは。
    英語なら、参考に出来そうなサイトがいくつかあります。
    どうせ、コードは英語ですから、Excutereader と ExecuteNonQuery 双方を使っているサイトを覗いて見るのも手だと思います。
    また、日本語等で、よいお手本が無いのには理由がありそうですが、
    上手く説明できないし、ご質問の趣旨からズレますし、ここで書き出すと余計 こんがらがってしまいそうなので ... 。
    • 編集済み ShiroYuki_Mot 2014年6月18日 2:40 特に後半。 を挿入。
    2014年6月18日 2:29
  • ShiroYuki_Motさんこんにちは。ExecuteNonQueryを調べるまでには至っておりませんが、すべての個所を変更しても波線はつきます。少し気になる所がないまでもないのですが、デバッグをすると、今までの経過のようになっています。私としてはもう少し熱意があればと思うのですが、虎の巻的な解決方法はないものでしょうか。
    2014年6月18日 5:52
  • bentensama さま。 拝見しました。

    検索はお嫌いですか。
    先に示したページの中には、それこそ「虎の巻的」なコードが書いてあった筈なんですけれど。

    只、闇雲に、語句の入れ替えを試されているとしたら、時間の無駄ですよ。
    書き方が違うと、お伝えした様に、一回、ご覧になって見て下さい。
    2014年6月19日 7:56
  • ShiroYuki_Mot様、色々とありがとうございます。すべてのソースを掲載する前に少しは調べましたが、何故初心者なのですべてを理解するには時間がかかりそうです。もし不自然な点がお分かりなら、教えていただけたらと思います。
    2014年6月19日 9:30
  • ここは、あなたが作ったコードをみんなでデバッグする場所ではありません。あなたが初心者だろうがそうでなかろうが、他の人にデバッグをさせないでください。


    Jitta@わんくま同盟

    2014年6月19日 14:15
  • Jitta さま フォローありがとうございます。 助かりました。

    bentensama さま お願いがあります。

    ソースコードの丸投げをしたり、提案された事項を試す気が無いのでしたら、ご質問はお止め下さい。
    ここは、添削教室ではありません。
    それに、このコードは Form1.vb で、質問内容とは関係ないですよね。。 元は確か Form3.vb ではなかったですか。
    ご質問文から、後日追加されたコードを 削除して頂けるよう様、提案します。

    後からご覧戴く方の為に、 参考コードを掲載します。 試してはいません、参考程度にご覧下さい。

    Public Sub Delete_One(ByVal Id As Integer)		   ' 引数の型は DB と合わせて。
    	' 存在する Id を削除する場合。 Exception は未考慮。
    	' 必要に応じて 引数の内容チェックを。 特に文字の場合。
    
    	' ExecuteNonQuery 利用。
            Dim con As New SqlConnection(Connection_String)  ' 設定値はここか 外部か で設定。
    
            Dim cmd As New SqlCommand("DELETE FROM Table_x WHERE id=@id", con)
            cmd.Parameters.AddWithValue("@id", Id)
            Using con
                con.Open()
                cmd.ExecuteNonQuery()
            End Using
    End Sub


    • 編集済み ShiroYuki_Mot 2014年6月20日 2:26 コードのミス訂正 ぽか しました。
    2014年6月20日 2:14
  • ShiroYuki_Motさま、ある所よりそれなりの回答を得ました。cmd.ExecteNonQueryはこの場合、cmd.ExcuteReaderで宜しいようでした。有難うございました。
    2014年6月20日 5:30
  • bentensama さま。 大変失礼を致しました。

    取得は Excutereader、その他は ExecuteNonQuery という解説のが多いのは、検索をして戴ければお分かり戴けると思います。

    しかし、逆に、その他の場合に、 Excutereader の使用が可能である事は、私の認識が間違っておりました。
    どちらも、SQL 文の実行をしますが、Excutereader は 結果を取得、ExecuteNonQuery は 結果なし・問い合わせ(Query)なし の違いでした。
    混乱する様な投稿で、申し訳ありませんでした。
    2014年6月20日 6:37
  • ShiroYuki_Motさま、ある所よりそれなりの回答を得ました。cmd.ExecteNonQueryはこの場合、cmd.ExcuteReaderで宜しいようでした。有難うございました。

    何をもって"宜しい"というかですが、動けば良いというのであれば確かに"宜しい"と思いますが、

    第3者が引きついだ際等にご理解を誘発する等、実装方法としてあるべき形を取れているかと言うと、一切"宜しくない"と思います。

    2014年6月20日 9:26
  • そもそもの問題は質問者さんのマナーにあると思います。

    「ある所よりそれなりの回答を得ました」と言うなら、ここで聞く必要はなくて「ある所」で聞いてほしいと思います。

    2014年6月20日 10:10