C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Accessからtextboxへ表示させるには


(過去ログ 30 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■14156 / inTopicNo.1)  Accessからtextboxへ表示させるには
  
□投稿者/ マユミ (1回)-(2008/02/11(Mon) 16:55:39)

分類:[VB.NET/VB2005] 

いつも参考にさせていただいております。

今回、データベースから読み込んだ値をtextboxなどに表示させたいのですが
行き詰まってしまったので質問させていただきました。

フォームにはTextboxのplanchangetextとdaychangetextが2つあり
この2つに表示させたい情報のキーワードを入れます。

ボタンをクリック後
キーワードで検索したデータベースの中身をTextbox Combobox DateTimePicker RadioButton
に表示させたいと考えています。


以下自分なりに作成してみたコードになります。

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim cn As New OleDb.OleDbConnection
Dim cmd As New OleDb.OleDbCommand
Dim rs As OleDb.OleDbDataReader
Dim a As Object
'Try
cn.ConnectionString = "Provider=Microsoft.jet.oledb.4.0;data source=scheduler.mdb"
cn.Open()

cmd = cn.CreateCommand()
cmd.CommandText = "SELECT 予定,内容 FROM db WHERE 予定 = '" & planchangetext.Text & "',日時 = '" & daychangetext.Text & "'"
'Try
rs = cmd.ExecuteReader()
response = rs.Read()
If response Then
textbox1.Text = rs.Item("予定").ToString
textbox2.Text = rs.Item("内容").ToString
DateTimePicker.Text = rs.Item("日時").ToString
Combobox1.Text = rs.Item("時間").ToString
textbox3.Text = rs.Item("分").ToString

If rs.Item("優先度") = "低" Then
cimportant1.Checked = True
ElseIf rs.Item("優先度") = "中" Then
cimportant2.Checked = True
ElseIf rs.Item("優先度") = "高" Then
cimportant3.Checked = True
End If

If rs.Item("残り日数") = "する" Then
cnews1.Checked = True
ElseIf rs.Item("残り日数") = "しない" Then
cnews2.Checked = True
End If

cn.Close()

Else
response = "該当するデータがありません"
cn.Close()

End If
'Catch ex As Exception
' MessageBox.Show("エラーが発生しました")
'End Try
End Sub

実行してみると
rs = cmd.ExecuteReader()のところで
'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。
と表示され処理が中断してしまいます。

使用DBはアクセス、言語はVB.NETです。

よろしくお願いします。
引用返信 編集キー/
■14158 / inTopicNo.2)  Re[1]: Accessからtextboxへ表示させるには
□投稿者/ やじゅ (145回)-(2008/02/11(Mon) 18:03:47)
やじゅ さんの Web サイト
2008/02/11(Mon) 18:05:29 編集(投稿者)

No14156 (マユミ さん) に返信
> rs = cmd.ExecuteReader()のところで
> 'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。
> と表示され処理が中断してしまいます。
>
>"SELECT 予定,内容 FROM db WHERE 予定 = '" & planchangetext.Text & "',日時 = '" & daychangetext.Text & "'
>

WHERE句の条件(',日時 = ')が違っていますね。例えば、"AND"がないとか・・・
引用返信 編集キー/
■14159 / inTopicNo.3)  Re[1]: Accessからtextboxへ表示させるには
□投稿者/ はつね (451回)-(2008/02/11(Mon) 19:54:23)
No14156 (マユミ さん) に返信
> 今回、データベースから読み込んだ値をtextboxなどに表示させたいのですが
> 行き詰まってしまったので質問させていただきました。

まず、基本的なところとして、AccessからTextBoxではなく、mdbファイルからTextBoxですね。
# VB/VB.NETからはAccessがなくてもmdbファイルの入出力が可能です。


>cmd.CommandText = "SELECT 予定,内容 FROM db WHERE 予定 = '" & planchangetext.Text & "',日時 = '" & daychangetext.Text & "'"

このときcmd.CommandTextにはどのような値が設定されているかステップ実行で確認してみてください。
SQL文が間違えているのが確認できると思います。
もし、どう間違えているのか分からないのであれば、Accessで該当mdbファイルを開いて、同じようなSQL文をクエリ(だったかな?)で組み立ててみると良いでしょう。次の2点が間違えていると分かると思います。
(1) 2つの条件を指定するときに「,」は使わない点
(2) 日時を指定するのに「'」で囲まない点


引用返信 編集キー/
■14160 / inTopicNo.4)  Re[1]: Accessからtextboxへ表示させるには
□投稿者/ 魔界の仮面弁士 (612回)-(2008/02/11(Mon) 19:56:06)
No14156 (マユミ さん) に返信
> Dim cmd As New OleDb.OleDbCommand
ここで、「New」を使ってオブジェクトを作成していますが、その後で、

> cmd = cn.CreateCommand()
ここで、別のオブジェクトを代入してしまいますよね。
後から CreateCommand の結果を代入するのであれば、宣言時の New は不要かと。


で、本題。

> cmd.CommandText = "SELECT 予定,内容 FROM db WHERE 予定 = '" & planchangetext.Text & "',日時 = '" & daychangetext.Text & "'"

[日時] という事は、日付部だけではなく、時刻部も含むのですよね。
だとすると…こうかな。「SQL インジェクション」への対策も忘れずに。

cmd.CommandText = String.Format( _
"SELECT 予定,内容 FROM db WHERE 予定='{0}' AND 日時=#{1:M\/d\/yyyy H\:mm\:ss}#", _
TextBox1.Text.Replace("'", "''"), DateTimePicker1.Value)


もしくは、Parameters を利用する方法もあります。SQL インジェクション対策なら、こちらの方が安全。
cmd.Parameters.Add の順番と、PARAMETERS コマンドの順番を一致させる必要があります。

cmd.CommandText = "PARAMETERS YOTEI TEXT, NICHIJI DATE; SELECT 予定,内容 FROM db WHERE 予定=YOTEI AND 日時=NICHIJI"
cmd.Parameters.Add("YOTEI", OleDb.OleDbType.VarWChar)
cmd.Parameters.Add("NICHIJI", OleDb.OleDbType.Date) 'DBTimeStamp でも可
cmd.Parameters("YOTEI").Value = TextBox1.Text '値の割り当て
cmd.Parameters("NICHIJI").Value = DateTimePicker1.Value


さらに、パラメータの型指定を自動判定に任せるなら、こんな書き方もできます。
(型が曖昧になるので個人的には非推奨ですが、スッキリ短く書けるので、可読性は良いかと)

cmd.CommandText = "SELECT 予定,内容 FROM db WHERE 予定=YOTEI AND 日時=?"
cmd.Parameters.AddWithValue("YOTEI", TextBox1.Text)
cmd.Parameters.AddWithValue("NICHIJI", DateTimePicker1.Value)
引用返信 編集キー/
■14161 / inTopicNo.5)  訂正
□投稿者/ 魔界の仮面弁士 (613回)-(2008/02/11(Mon) 20:12:30)
No14160 (魔界の仮面弁士) への訂正
> cmd.CommandText = String.Format( _
>   "SELECT 予定,内容 FROM db WHERE 予定='{0}' AND 日時=#{1:M\/d\/yyyy H\:mm\:ss}#", _
>   TextBox1.Text.Replace("'", "''"), DateTimePicker1.Value)

間違っていました。
これだと、コントロールパネルの設定によっては正しい結果が得られません。(和暦にしている場合など)
下記のようにしてください。

cmd.CommandText = String.Format(New System.Globalization.CultureInfo("en-us"), _
  "SELECT 予定,内容 FROM db WHERE 予定='{0}' AND 日時=#{1:M\/d\/yyyy H\:mm\:ss}#", _
  TextBox1.Text.Replace("'", "''"), DateTimePicker1.Value)


ただしできれば、上記のように SQL 中にデータを埋め込む方法では無く、
> もしくは、Parameters を利用する方法もあります。
を使うことをおすすめします。(こちらであれば、地域設定が和暦であっても問題無いので)

引用返信 編集キー/
■14200 / inTopicNo.6)  Re[2]: Accessからtextboxへ表示させるには
□投稿者/ マユミ (2回)-(2008/02/12(Tue) 23:25:59)
やじゅ様 はつね様 魔界の仮面弁士様
ご返信ありがとうございます。

皆様のご指導のおかげでTextBoxに表示させることができました。

しかし、DateTimePicker.Text = rs.Item("日時").ToStringのところで
エラーが発生し、処理が止まってしまいます。
DateTimePicker.Text = rs.Item("日時").ToString
をコメントアウトして実行してみても次の
Combobox1.Text = rs.Item("時間").ToString
で処理がとまってしまいます。
DateTimePickerやCombobox1に表示させるには
何か別の処理を行わなくてはならないのでしょうか?

引用返信 編集キー/
■14201 / inTopicNo.7)  Re[3]: Accessからtextboxへ表示させるには
□投稿者/ はつね (452回)-(2008/02/12(Tue) 23:41:00)
No14200 (マユミ さん) に返信
> しかし、DateTimePicker.Text = rs.Item("日時").ToStringのところで

DateTimePicker.Textにはどのような値が設定されるべきか調べてみましたか?
正確には、どのような形式の文字列。

で、それと、rs.Item("日時").ToStringが一致しているかを確認してみましょう。


> Combobox1.Text = rs.Item("時間").ToString

こちらも同様ですね。

両者とも単にString型に型変換すればいいという訳ではないという点が重要。
Format使って文字列のスタイルを合わせるようにしましょう。

引用返信 編集キー/
■14202 / inTopicNo.8)  Re[3]: Accessからtextboxへ表示させるには
□投稿者/ 魔界の仮面弁士 (614回)-(2008/02/12(Tue) 23:55:31)
No14200 (マユミ さん) に返信
> しかし、DateTimePicker.Text = rs.Item("日時").ToStringのところで
DateTimePicker1.Value = rs.Item("日時") だと思いますよ。

> エラーが発生し、処理が止まってしまいます。
どのようなエラーですか?
Option Strict On によるコンパイルエラーなら、日付型へのキャストが必要ですし、
NULL の扱いによるエラーであるなら、代入前に(IsDBNull 等での)事前確認が必要です。


> Combobox1.Text = rs.Item("時間").ToString
ComboBox のリストに、新たな値を「追加登録」しようとしているのでしょうか?
それとも既存のリストの中から、「選択」しようとしているのでしょうか?

前者であれば、.Items.Add(…) を使ってみてください。
後者であれば、.SelectedIndex 等を用いてみてください。
引用返信 編集キー/
■14204 / inTopicNo.9)  Re[4]: Accessからtextboxへ表示させるには
□投稿者/ はつね (453回)-(2008/02/13(Wed) 00:51:28)
> ComboBox のリストに、新たな値を「追加登録」しようとしているのでしょうか?
> それとも既存のリストの中から、「選択」しようとしているのでしょうか?
>
> 前者であれば、.Items.Add(…) を使ってみてください。

.Textで選択しているから、選択する文字列が一致しないと踏みましたが、この可能性もありますね。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -