- PR -

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

投稿者投稿内容
araariaru
会議室デビュー日: 2005/01/20
投稿数: 14
投稿日時: 2005-02-09 17:08
ASP.NET(WebMatrix使用)でWebアプリケーションを開発しています。
言語はVB.NET、DBはMSDE、開発マシンは2000 SP4です。

DBのテーブルにバインドしたDropDownListで選択されたValueをInsertDataMethodを使い、同DBの別テーブルに登録しようとしています。

DropDownListは次のように定義しています。
Dim ds_process As DataSet
Dim sCmd_process as System.Data.SqlClient.SqlDataAdapter
Dim connectionString As String = "server='(local)'; trusted_connection=true; database='process_db'"
Dim sConn As System.Data.IDbConnection = New System.Data.SqlClient.SqlConnection(connectionString)
Dim strSQL_process as String= "SELECT process_code, process_name FROM process_master WHERE process_master.post_code =" & drpl_post.SelectedItem.Value

sCmd_process = new System.Data.SqlClient.SqlDataAdapter(strSQL_process,sConn)
ds_process = New DataSet()

sCmd_process.Fill(ds_process)
drpl_process1.DataSource = ds_process
drpl_process1.DataTextField = "process_name"
drpl_process1.DataValueField = "process_code"
drpl_process1.DataBind()

登録タイミングはButtonのクリックイベントです。
クリックイベントでは、
 InsertData(drpl_process1.SelectedItem.Value)
としています。※実際は17個の引数をもち、いずれの引数も別DropDownListのSelectedItem.Valueを渡しています)
InsertDataの引数のデータ型はすべてIntegerとなっています。

drpl_process1とまったく同じようにして生成した、他のデータはエラーなく登録されますが、
このdrpl_process1.SelectedItem.Valueでエラーが出てしまいます。
エラー内容は次のとおりです。
 入力文字列の形式が正しくありません。
 例外の詳細: System.FormatException: 入力文字列の形式が正しくありません。

ちなみにこの部分に数字を直接書いてButtonをクリックすると正常に保管されます。

一体drpl_process1にどのような問題があるのでしょうか?
drpl_process1はTableに配置したDropDownListです。
アドバイスをお願いします。

SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-02-09 17:53
こんばんわ。

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

このエラーからして、たぶんdrpl_process1.SelectedItem.Valueには文字列が
入っていると思われます。InsertData(ByRef test As Integer)な訳ですよね?

実際簡単なプログラムで試しましたが、DropDownList1.SelectedItem.Value
に文字列(例えば"Value1"など)が入っている場合に同様のエラーが発生します。

コード:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

InsertData(DropDownList1.SelectedItem.Value)

End Sub

Private Sub InsertData(ByRef test As Integer)
   '' なんか処理
End Sub



一度、InsertData(DropDownList1.SelectedItem.Value)のところで
ブレークポイント置いてみて中身を見てください。
Milan
常連さん
会議室デビュー日: 2005/01/05
投稿数: 33
投稿日時: 2005-02-09 17:54
こんにちは。
質問からは正確な解答はしかねますが、原因の可能性だけでも。

System.FormatExceptionということですから、
メソッドを呼び出すときに渡した引数の書式が、
対応する仮パラメータ型の書式と一致していないということ。

怪しいのはInsertDataメソッド(自作?)
の中でFormat.Stringメソッド等を使用して
引数の渡し方をミスっているのではないかなと思うのですが。
引数の数が17個というのがとても気になります。


[ メッセージ編集済み 編集者: Milan 編集日時 2005-02-09 17:56 ]
araariaru
会議室デビュー日: 2005/01/20
投稿数: 14
投稿日時: 2005-02-10 13:44
SE卵さん、Milanさん返信ありがとうございます。

drpl_process1.SelectedItem.Value値を確認する為に、@PageディレクティブTrace="True"とDebug="True"を追加しました。
その結果、上記値は文字列ではなく数値が入っていました。
WebMatrixを使ってブレークポイントを貼る方法がわからないで、トレース昨日を使いました。

InsertDataメソッドは、WebMatrixのコードウィザードを使い生成しました。
これがその関数です。
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
また、drpl_process1.SelectedItem.Valueを引き渡し、実際のDBにセットされる部分のコードは次のとおりです。
 Dim dbParam_process_code1 As System.Data.IDataParameter = New  System.Data.SqlClient.SqlParameter
dbParam_process_code1.ParameterName = "@process_code1"
dbParam_process_code1.Value = process_code1
dbParam_process_code1.DbType = System.Data.DbType.Int32
dbCommand.Parameters.Add(dbParam_process_code1)
DbtypeもInt32となっているため問題ないと思うのですが。

引数の数とかに問題があるのでしょうか?ですが、InsertDataメソッドに数値を直接引き渡すと正常にDB登録しますので、引数の数には問題ないですよね?

初歩的な質問攻めで申し訳ありませんが、よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-02-10 14:38
InsertDataに文字列を引数で渡しているんですよね?
ソースの先頭に

Option Strict On

を追加してみてください。コンパイルが通りますか?
おふぃすこま
常連さん
会議室デビュー日: 2005/01/24
投稿数: 22
投稿日時: 2005-02-10 15:06
引用:

burton999さんの書き込み (2005-02-10 14:38) より:
InsertDataに文字列を引数で渡しているんですよね?
ソースの先頭に

Option Strict On

を追加してみてください。コンパイルが通りますか?


WebMatrixを使用しているならば、
<%@ Page Language="VB" Strict="True"%>
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-02-10 16:06
引用:

WebMatrixを使用しているならば、
<%@ Page Language="VB" Strict="True"%>



失礼しました。
WebMatrixではインラインコードのみサポートなのですね。
デバッグ機能もないし、結構大変ですね。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-02-10 21:28
DropDownList.SelectedValueはStringですよ。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwebuiwebcontrolslistitemclassvaluetopic.asp

HTMLなんですからね。数字が入った文字列です。ちゃんとパースしてください。
_________________

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