- PR -

DropDownListのSelectedItem.ValueのDBインサート

投稿者投稿内容
araariaru
会議室デビュー日: 2005/01/20
投稿数: 14
投稿日時: 2005-02-14 14:00
皆様返信ありがとうございます。

>DropDownList.SelectedValueはStringですよ。
確認しました。その通りです。

>ちゃんとパースしてください。
つまり変換ですよね?Parseを調べて実装してみたのですが、エラーになります。

Parse自体を確認しようと思い、次のようなソースを実装してみました。
 Dim s as String
 Dim i as Integer
 s = drpl_process1.SelectedItem.Value
 i = Integer.Parse(s)
が・・・結果は「入力文字列の形式が正しくありません。例外の詳細: System.FormatException: 入力文字列の形式が正しくありません。」
と出てしまいます。Parseの使い方に問題があるのでしょうか?

また、同じInsertDataの引数でSelectedItem.Valueを変換せずに渡しているものが
あるのですが、それについてはエラーが出ないのはなぜですか?同じくStringであれば
それらについてもエラーが出るのではないでしょうか?

おふぃすこま
常連さん
会議室デビュー日: 2005/01/24
投稿数: 22
投稿日時: 2005-02-14 16:09
おふぃすこまです。

まず、私やburton999さんが言った事は試してみました?
とりあえずそれで本当に数値が入ってるか分かるので。

それと、数値と仰っているのは 5.0 とかではないですよね?
『そんな事知ってるよ!』って言われるかもしれませんが、
Integer は整数なので、少数点では例外が発生します。

引用:

また、同じInsertDataの引数でSelectedItem.Valueを変換せずに渡しているものが
あるのですが、それについてはエラーが出ないのはなぜですか?同じくStringであれば
それらについてもエラーが出るのではないでしょうか?


ここからは私個人の意見なのですが、出るものと出ないものがある・・・と言う議論も
確かに重要なのですが、まずは変換ありきで考えた方がいいと思いますよ。
メソッドの引数はIntegerなのに、呼び出し元の指定がStringって、普通に考えたらおかしいですよね?
その状態で悩むよりも、『変換が必要なものは全て変換する』という方針で進んだ方が良いと思います。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-02-14 17:50
String sにはどんな文字列が格納されているのでしょうか?
普通にIntegerに変換できない文字がはいっていると思われます。。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-02-14 21:37
ちょっと整理。。。
コード:
' 宣言
Function InsertData( _
  ByVal post_code As Integer, _
  ByVal project_code As Integer, _
  ByVal process_code1 As Integer, _
  ByVal process_code2 As Integer, _
  ByVal process_code3 As Integer, _
  ByVal process_code4 As Integer, _
  ByVal process_code5 As Integer, _
  ByVal process_code6 As Integer, _
  ByVal process_code7 As Integer, _
  ByVal process_code8 As Integer, _
  ByVal process_code9 As Integer, _
  ByVal process_code10 As Integer, _
  ByVal process_code11 As Integer, _
  ByVal process_code12 As Integer, _
  ByVal process_code13 As Integer, _
  ByVal process_code14 As Integer, _
  ByVal process_code15 As Integer) As Integer
...
End Function

...
    ' 呼び出し
    InsertData( _
      drpl_process0.SelectedItem.Value, _
      drpl_process1.SelectedItem.Value, _
      drpl_process2.SelectedItem.Value, _
      drpl_process3.SelectedItem.Value, _
      drpl_process4.SelectedItem.Value, _
      drpl_process5.SelectedItem.Value, _
      drpl_process6.SelectedItem.Value, _
      drpl_process7.SelectedItem.Value, _
      drpl_process8.SelectedItem.Value, _
      drpl_process9.SelectedItem.Value, _
      drpl_process10.SelectedItem.Value, _
      drpl_process11.SelectedItem.Value, _
      drpl_process12.SelectedItem.Value, _
      drpl_process13.SelectedItem.Value, _
      drpl_process14.SelectedItem.Value, _
      drpl_process15.SelectedItem.Value)
...


こういうコードを書いている、と考えてよろしいですか?そして、次のように書くと期待通りに処理される、と。
コード:
...
    ' 呼び出し
    InsertData( _
      drpl_process0.SelectedItem.Value, _
      100I, _
      drpl_process2.SelectedItem.Value, _
      drpl_process3.SelectedItem.Value, _
      drpl_process4.SelectedItem.Value, _
      drpl_process5.SelectedItem.Value, _
      drpl_process6.SelectedItem.Value, _
      drpl_process7.SelectedItem.Value, _
      drpl_process8.SelectedItem.Value, _
      drpl_process9.SelectedItem.Value, _
      drpl_process10.SelectedItem.Value, _
      drpl_process11.SelectedItem.Value, _
      drpl_process12.SelectedItem.Value, _
      drpl_process13.SelectedItem.Value, _
      drpl_process14.SelectedItem.Value, _
      drpl_process15.SelectedItem.Value)
...


それで、私のレスを受けての分ですが、次のようにして、やはりFormatExceptionが生成される、ということですか?
コード:
...
    ' 呼び出し
    Dim val1 As Integer = Integer.Parse(drpl_process1.SelectedItem.Value)
    InsertData( _
      drpl_process0.SelectedItem.Value, _
      val1, _
      drpl_process2.SelectedItem.Value, _
      drpl_process3.SelectedItem.Value, _
      drpl_process4.SelectedItem.Value, _
      drpl_process5.SelectedItem.Value, _
      drpl_process6.SelectedItem.Value, _
      drpl_process7.SelectedItem.Value, _
      drpl_process8.SelectedItem.Value, _
      drpl_process9.SelectedItem.Value, _
      drpl_process10.SelectedItem.Value, _
      drpl_process11.SelectedItem.Value, _
      drpl_process12.SelectedItem.Value, _
      drpl_process13.SelectedItem.Value, _
      drpl_process14.SelectedItem.Value, _
      drpl_process15.SelectedItem.Value)
...



 最初の投稿では、『InsertData(drpl_process1.SelectedItem.Value)』となっていますが、このコードは実際に走らせたコードではないですよね?そういうのは混乱する元なのでやめましょう。

 それから『InsertDataメソッドに数値を直接引き渡すと正常にDB登録しますので』というのも、すべての引数を数値にしたのか、特定の引数だけ数値にしたのかわかりません。そのため、この投稿をしています。これって、あなたにとって時間の浪費でしかないですよね?
 私たちはあなたの横にいるわけではありません。そのため、あなたが書いたことしかわかりません。あなたが削除した情報を、私たちが補完することは出来ません。どれが必要かわからなければ、とりあえずすべて書き出してください。多すぎる情報から削除することは出来ても、ない情報を作り出すことは出来ないからです。
# かといって、整理して書かれていなければ読まれないわけで
# その辺が難しいのですけど(^_^;

_________________
araariaru
会議室デビュー日: 2005/01/20
投稿数: 14
投稿日時: 2005-02-21 13:34
何度も申し訳ありません。

>まず、私やburton999さんが言った事は試してみました?
おふぃすこまさんとburton999から言われましたStrict=onを実装したところ、
今回の問合せと別の個所で次のエラーが出ました。
 BC30512: Option Strict On で 'System.Object' から 'System.Data.DataSet' への暗 黙的な変換はできません。
これについては、別途調べたいと思います。

Jittaさんに投稿方法で注意されるのは2度目です。(苦笑)
前回ソースを提示したところ「丸投げは良くない」といわれたので、自分なりにエラー原因と思われる個所のみをピックアップして掲示したのですが、これまた失敗だったようですね。難しいです。

Jittaさんが整理してくださった通りのコードです。
またJittaさんのレスを受けてのコードは、次の通りです。
' 呼び出し
Dim val1 As Integer = Integer.Parse(drpl_process1.SelectedItem.Value)
InsertData(drpl_post.SelectedItem.Value,drpl_project.SelectedItem.Value, _
val1,11,12,13,14,15,16,17,18,19,20,21,2,2,2)

第1,2引数はSelectedItem.Valueを直接引き渡してもエラーにはならず、第3引数以降にエラーが出ることが分かっていた為、Parseした値以外は数値を直接記述して試しました。
その結果下記エラーが出ます。

System.FormatException: 入力文字列の形式が正しくありません。

ソース エラー:
行 120:
行 121: Sub Button1_Click(sender As Object, e As EventArgs)
行 122: Dim val1 As Integer = Integer.Parse(drpl_process1.SelectedItem.Value)
行 123: InsertProjectProcess(6234,drpl_project.SelectedItem.Value, _
行 124: val1,11,12,13,14,15,16,17,18,19,20,21,2,2,2)

このような情報提示でご指導いただけますでしょうか?
まだ何か過不足がありましたらご指摘願います。

burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-02-21 15:25
確認したいのですが、
InsertDataに渡そうとしている
SelectedItem.Valueに格納されている文字列は全て
ちゃんと数字(数値に変換できる文字列)なんですかね?

ちなみに
>BC30512: Option Strict On で 'System.Object' から 'System.Data.DataSet' への暗 黙的な変換はできません。

これは、キャストしてくれってことです。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2005-02-21 16:46
Dim val1 As Integer = Integer.Parse(drpl_process1.SelectedItem.Value)
InsertData(drpl_post.SelectedItem.Value,drpl_project.SelectedItem.Value, _
val1,11,12,13,14,15,16,17,18,19,20,21,2,2,2)

これを

Dim val1 As Integer = 1
InsertData(drpl_post.SelectedItem.Value,drpl_project.SelectedItem.Value, _
val1,11,12,13,14,15,16,17,18,19,20,21,2,2,2)

に変更した場合、エラーが発生しますか?

あと、drpl_process1.SelectedItem.Valueの中身をデバック用のラベルにでも
出力して確認されてみてはどうでしょうか
(空文字ってことはないですか)
araariaru
会議室デビュー日: 2005/01/20
投稿数: 14
投稿日時: 2005-02-21 17:17
ゆうじゅん様
>Dim val1 As Integer = 1
>InsertData(drpl_post.SelectedItem.Value,drpl_project.SelectedItem.Value, _
>val1,11,12,13,14,15,16,17,18,19,20,21,2,2,2)
>に変更した場合、エラーが発生しますか?
エラーにならずにDB登録されます。

>あと、drpl_process1.SelectedItem.Valueの中身をデバック用のラベルにでも
>出力して確認されてみてはどうでしょうか
Insertメソッドをコメントアウトし、Label3.Text = drpl_process1.SelectedItem.Value
と追記してみたところ表示されません。つまり空文字ということなんでしょうか?
ちなみに、drpl_post.SelectedItem.Value,drpl_project.SelectedItem.Valueを試してみたところ、選択したアイテムのValueが表示されます。
DropDownリストの作成方法に問題があるのでしょうか?

burton999様
>SelectedItem.Valueに格納されている文字列は全て
>ちゃんと数字(数値に変換できる文字列)なんですかね?
DBのテーブルを利用してDropDownListにしています。DropDownList生成時のDataValueFieldにはテーブルのアイデンティティカラムを設定しています。
このカラムはint型でNull禁止としています。

もう一度DropDownList生成等に問題がないか、見直してみます。

スキルアップ/キャリアアップ(JOB@IT)