トップ回答者
ハンドルされていない例外が

質問
-
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"の部分が色でおおわれ「ハンドルされていない例外が」と表示されデバッグが中止されます。問題がよくわからないのですが、どこに支障があるのでしょうか。
- 編集済み bentensama 2014年6月20日 5:26
回答
-
先週の質問で正しく修正されたはずですが、また、つづりの間違いです。
Integreted Security -> Integrated Securitycn.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
すべての返信
-
先週の質問で正しく修正されたはずですが、また、つづりの間違いです。
Integreted Security -> Integrated Securitycn.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
-
やり取はとりあえず置いといて、もう少し技術的なフォローが必要だと思いましたので、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 名前空間にピリオド追加等
-
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 特に後半。 を挿入。
-
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 コードのミス訂正 ぽか しました。
-