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

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

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

Re[7]: データベースの更新処理で行き詰りました。


(過去ログ 49 を表示中)

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

■26794 / inTopicNo.1)  データベースの更新処理で行き詰りました。
  
□投稿者/ ながなが (1回)-(2008/10/21(Tue) 13:31:12)

分類:[ASP.NET (VB)] 

ページ読込時にADO.NETでSQLサーバからデータを取得し、夫々のテキストボックスに値を入れ、登録ボタンクリック時そのテキストボックスの内容をサーバに書き込む処理を実施しましたがなかなか書き込めません。どこが悪いのか悪戦苦闘しております。
何方か御教授よろしくお願いいたします。

以下はページ読込時イベントです。

Protected Sub Page_Load _
(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
'
'
'
'
'
'
' 読込時、新規追加モード又は修正モードの判断
'
'
'
'
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'************************************************************'
' クッキーの取込
'************************************************************'
Me.txt社員コード.Text = _
Request.Cookies("CookieName1").Value

Me.txt社員名.Text = _
Request.Cookies("CookieName2").Value

Me.txt固定資産コード.Text = _
Request.Cookies("CookieName3").Value

Me.txt入力モード.Text = _
Request.Cookies("CookieName4").Value

Me.txtUPID.Text = _
Request.Cookies("CookieName5").Value

Dim ADDUPFLG As Long
ADDUPFLG = Me.txt入力モード.Text

'************************************************************'
' 前頁でデータが存在する時は修正モード→そのデータを取得する
'************************************************************'
Dim UPID As Long
UPID = Me.txtUPID.Text
'************************************************************'
'************************************************************'
' 修正モードの時、データを取得
'************************************************************'
'************************************************************'
If ADDUPFLG = 1 Then

'//---コネクション
Dim Mycn As New SqlConnection _
("Data Source=anp_sqlserver;" _
& "Initial Catalog=" & "PC固定資産管理システム" _
& ";User ID=sa;password=''")

'//---アダプタ
Dim MyAdapter As New SqlDataAdapter _
("select * from [TA1001_PCマスタ] " _
& "where ID=" _
& Me.txtUPID.Text & "", Mycn)

'//---Datasetオブジェクト
Dim MyDataSet As New DataSet
Mycn.Open()

'//---テーブル
Dim MyTable As DataTable
'************************************************************'
' 接続開始
'************************************************************'
MyAdapter.Fill(MyDataSet, "TA1001_PCマスタ")
MyTable = MyDataSet.Tables("TA1001_PCマスタ")
'------------------------------------------------------------'
' データを追加
'------------------------------------------------------------'
Me.txtPC名.Text = MyTable.Rows(0)("PC名")
Me.cboOS名.SelectedValue = MyTable.Rows(0)("OS名")
Me.txt使用用途.Text = MyTable.Rows(0)("使用用途")
Me.txt社員コード.Text = MyTable.Rows(0)("社員コード")
Me.txt社員名.Text = MyTable.Rows(0)("社員名")
Me.txtJobコード.Text = MyTable.Rows(0)("JOBコード")
Me.txt固定資産コード.Text = MyTable.Rows(0)("固定資産管理コード")

Me.txt納品日.Text = MyTable.Rows(0)("納品日")

Me.cbo資産区分.Text = MyTable.Rows(0)("資産区分ID")
If Not (MyTable.Rows(0)("搭載メモリ容量") Is System.DBNull.Value) Then
Me.txt搭載メモリ容量.Text = MyTable.Rows(0)("搭載メモリ容量")
End If

If Not (MyTable.Rows(0)("搭載HDD容量") Is System.DBNull.Value) Then
Me.txt搭載HDD容量.Text = MyTable.Rows(0)("搭載HDD容量")
End If

If Not (MyTable.Rows(0)("搭載CPU名ID") Is System.DBNull.Value) Then
Me.cbo搭載CPU名.SelectedValue = MyTable.Rows(0)("搭載CPU名ID")
End If

If Not (MyTable.Rows(0)("搭載CPU周波数") Is System.DBNull.Value) Then
Me.txt搭載CPU周波数.Text = MyTable.Rows(0)("搭載CPU周波数")
End If

If Not (MyTable.Rows(0)("機種区分ID") Is System.DBNull.Value) Then
Me.cbo機種区分.SelectedValue = MyTable.Rows(0)("機種区分ID")
End If

Me.txt設置場所.Text = MyTable.Rows(0)("設置場所")



Mycn.Close()

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
'
'
'
'
'
' Jobコード名を取得
'
'
'
'
'
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim JobCode As Long
If Me.txtJobコード.Text <> "" Then
JobCode = Me.txtJobコード.Text
'//---コネクション
Mycn = New SqlConnection("Data Source=anp_sqlserver;" _
& "Initial Catalog=" & "jinkenhisanteidb" _
& ";User ID=sa;password=''")
Mycn.Open()

'//---アダプタ
MyAdapter = New SqlDataAdapter _
("select * from [TA0002_原価計算グループマスタ] " _
& "where ID=" & JobCode, Mycn)

'//---データセット
MyDataSet = New DataSet

'//---データテーブル
MyTable = New DataTable
'************************************************************'
' 接続開始
'************************************************************'
MyAdapter.Fill(MyDataSet, "TA0002_原価計算グループマスタ")
MyTable = MyDataSet.Tables("TA0002_原価計算グループマスタ")

Me.txtJob.Text = MyTable.Rows(0)("JobName")


End If

Mycn.Close()
End If

End Sub

引用返信 編集キー/
■26795 / inTopicNo.2)  Re[1]: データベースの更新処理で行き詰りました。
□投稿者/ ながなが (2回)-(2008/10/21(Tue) 13:31:47)

また、以下が書き込みイベントです。


Protected Sub cmd登録_Click _
(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles cmd登録.Click
Dim ret As Integer
ret = MsgBox("このデータで書き込んでもよろしいですか?", vbYesNo)
If ret = vbNo Then
Exit Sub
End If

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
'
'
'
'
'
'
' サーバに書込む
'
'
'
'
'
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'************************************************************'
' 初期処理
'************************************************************'

'//---コネクション
Dim Mycn As New SqlConnection _
("Data Source=anp_sqlserver;" _
& "Initial Catalog=" & "PC固定資産管理システム" _
& ";User ID=sa;password=''")
Mycn.Open()
Dim MyAdapter As SqlDataAdapter
'//---データセット
Dim MyDataSet As DataSet
Dim MyTable As DataTable
Dim Myrow As DataRow

'//---更新したい固定資産ID
Dim KoteishisanID As Long

'//---自動生成コマンド(sqlcommandbuilderオブジェクト)を作成
Dim Mycmd As SqlCommandBuilder






'************************************************************'
'************************************************************'
' 更新モードの時、データを搾り出して更新
'************************************************************'
'************************************************************'
If Me.txt入力モード.Text = 1 Then
KoteishisanID = Me.txtUPID.Text
MyDataSet = New DataSet()
MyAdapter = New SqlDataAdapter _
("select * from [TA1001_PCマスタ] where ID=" _
& KoteishisanID, Mycn)
MyAdapter.Fill(MyDataSet, "TA1001_PCマスタ")

'//---tbに「TA1001_PCマスタ」をセット
MyTable = MyDataSet.Tables("TA1001_PCマスタ")
'--------------------------------------------------------'
' レコードを更新
'--------------------------------------------------------'
'//---行の更新開始
MyTable.Rows(0).BeginEdit()
'//---更新開始

      ※↓ここの処理が全く反応しません。
例えば「txtPC名」テキストボックスが元は「AA」と言う値が入っていたとします。「txtPC名」を「BB」と更新し、msgbox(me.txtPC名.text)命令を書き込んだ場合「AA」とでます。又、直接「MyTable.Rows(0)("PC名") = Me.txtPC名.Text」を「MyTable.Rows(0)("PC名") ="WWW"」と書き込んだ場合、サーバは更新されております。何か忘れてるコマンドがあるのでしょうか?

MyTable.Rows(0)("PC名") = Me.txtPC名.Text
MyTable.Rows(0)("OS名") = Me.cboOS名.SelectedValue
MyTable.Rows(0)("使用用途") = Me.txt使用用途.Text
MyTable.Rows(0)("社員コード") = Me.txt社員コード.Text
MyTable.Rows(0)("社員名") = Me.txt社員名.Text
MyTable.Rows(0)("JOBコード") = Me.txtJobコード.Text
MyTable.Rows(0)("固定資産管理コード") = Me.txt固定資産コード.Text
If Me.txt納品日.Text <> "" Then
MyTable.Rows(0)("納品日") = CDate(Me.txt納品日.Text)
End If
MyTable.Rows(0)("資産区分ID") = Me.cbo資産区分.Text
If Me.txt搭載メモリ容量.Text <> "" Then
MyTable.Rows(0)("搭載メモリ容量") = Me.txt搭載メモリ容量.Text
End If
If Me.txt搭載HDD容量.Text <> "" Then
MyTable.Rows(0)("搭載HDD容量") = Me.txt搭載HDD容量.Text
End If
MyTable.Rows(0)("搭載CPU名ID") = Me.cbo搭載CPU名.SelectedValue
If Me.txt搭載CPU周波数.Text <> "" Then
MyTable.Rows(0)("搭載CPU周波数") = Me.txt搭載CPU周波数.Text
End If
MyTable.Rows(0)("機種区分ID") = Me.cbo機種区分.SelectedValue
MyTable.Rows(0)("設置場所") = Me.txt設置場所.Text

'//---更新終了
MyTable.Rows(0).EndEdit()


'//---自動生成コマンド
Dim MyCommand As New SqlCommandBuilder(MyAdapter)
'//---SQLDataAdapterオブジェクトに自動生成コマンドをセット
MyAdapter.UpdateCommand = MyCommand.GetUpdateCommand
'//---SQLDataAdapterオブジェクトを更新
MyAdapter.Update(MyDataSet, "TA1001_PCマスタ")

'//---終了メッセージ
MsgBox(Me.txtPC名.Text _
& " の更新処理が完了しました!システムを終了します.")
End If
'************************************************************'
'************************************************************'
' 新規の行を作成(新規追加モードの時)
'************************************************************'
'************************************************************'

If Me.txt入力モード.Text = 0 Then
MyDataSet = New DataSet()
'//---Datasetオブジェクトにデータをバインド
MyAdapter = _
New SqlDataAdapter("select * from [TA1001_PCマスタ]", Mycn)
MyAdapter.Fill(MyDataSet, "TA1001_PCマスタ")

'//---tbに「TA1001_PCマスタ」をセット
MyTable = MyDataSet.Tables("TA1001_PCマスタ")

Myrow = MyTable.NewRow()
'--------------------------------------------------------'
' データを追加
'--------------------------------------------------------'
Myrow("PC名") = Me.txtPC名.Text
Myrow("OS名") = Me.cboOS名.SelectedValue
Myrow("使用用途") = Me.txt使用用途.Text
Myrow("社員コード") = Me.txt社員コード.Text
Myrow("社員名") = Me.txt社員名.Text
If Me.txtJobコード.Text <> "" Then
Myrow("JOBコード") = Me.txtJobコード.Text
End If
If Me.txt固定資産コード.Text <> "" Then
Myrow("固定資産管理コード") = Me.txt固定資産コード.Text
End If

If Me.txt納品日.Text <> "" Then
Myrow("納品日") = CDate(Me.txt納品日.Text)
End If

Myrow("資産区分ID") = Me.cbo資産区分.Text
If Me.txt搭載メモリ容量.Text <> "" Then
Myrow("搭載メモリ容量") = Me.txt搭載メモリ容量.Text
End If

If Me.txt搭載HDD容量.Text <> "" Then
Myrow("搭載HDD容量") = Me.txt搭載HDD容量.Text
End If

Myrow("搭載CPU名ID") = Me.cbo搭載CPU名.SelectedValue
If Me.txt搭載CPU周波数.Text <> "" Then
Myrow("搭載CPU周波数") = Me.txt搭載CPU周波数.Text
End If

Myrow("機種区分ID") = Me.cbo機種区分.SelectedValue
Myrow("設置場所") = Me.txt設置場所.Text



'//---行を更新
MyTable.Rows.Add(Myrow)


Mycmd = New SqlCommandBuilder(MyAdapter)

'//---sqlDataAdapterオブジェクトに自動生成コマンドをセット
MyAdapter.InsertCommand = Mycmd.GetInsertCommand

'//---sqlDataadapterオブジェクトを更新
MyAdapter.Update(MyDataSet, "TA1001_PCマスタ")
MsgBox(Me.txtPC名.Text & " の新規追加処理が完了しました!システムを終了します.")
End If

Mycn.Close()
Response.Redirect("toppage.aspx")

End Sub
引用返信 編集キー/
■26798 / inTopicNo.3)  Re[2]: データベースの更新処理で行き詰りました。
□投稿者/ ロック (128回)-(2008/10/21(Tue) 13:44:39)
とりあえず、簡単なところから確認を
SqlCommandBuilderはDBに主キーが無い場合は、Updateコマンドとか
作ってくれないと思いましたが、その辺は大丈夫ですか?

SqlCommandBuilderのInsertコマンドを確認して、どんなSQL文が
作成されているか確認してみては?

引用返信 編集キー/
■26799 / inTopicNo.4)  Re[3]: データベースの更新処理で行き詰りました。
□投稿者/ ながなが (3回)-(2008/10/21(Tue) 13:53:31)
No26798 (ロック さん) に返信
> とりあえず、簡単なところから確認を
> SqlCommandBuilderはDBに主キーが無い場合は、Updateコマンドとか
> 作ってくれないと思いましたが、その辺は大丈夫ですか?
主キーは作成しております。


又、今発見したのですが、テキストボックス「txtPC名」の更新後イベントに更新された値をメッセージボックスで出るようにしました。入力更新前の値:「AAA」入力更新後の値:「BBB」と言う風に。結果メッセージボックスは「AAA」とでます。どうしてでしょうか?






> SqlCommandBuilderのInsertコマンドを確認して、どんなSQL文が
> 作成されているか確認してみては?
>
引用返信 編集キー/
■26801 / inTopicNo.5)  Re[4]: データベースの更新処理で行き詰りました。
□投稿者/ ロック (129回)-(2008/10/21(Tue) 14:16:42)
実は、VBは詳しくないですし、データアダプタのUpdateもあまり使わないので
詳しくないのですが(汗

データアダプタをクラスメンバにするとどうなります?
あと、Update()をtry-catchしてExceptionの値を見ればもっと詳しいエラーが
わかるかと思います。

あとは、時間があるときにソースをじっくり見ないとわかりません
ごめんなさい、ちょっと今は難しいです

ところで、生成されたInsertCommandはどうでしたか?
そのコマンドが動けば問題なくInsertされるコマンドになっていましたか?
引用返信 編集キー/
■26805 / inTopicNo.6)  Re[5]: データベースの更新処理で行き詰りました。
□投稿者/ ながなが (5回)-(2008/10/21(Tue) 14:30:51)
申し訳ございません。
ADO.NET以前の問題でした。
例えば新規にWEBページを作成し、テキストボックス(名:txtテキスト)とコマンドボタン(cmdコマンド)を夫々1づつ作成しました。
フォーム読込時に、
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.txtテキスト.Text = "AAA"
End Sub

とコードでテキストボックスに「AAA」と入れました。

その後「txtテキスト」を手動で「AAA」をバックスペースで消して「BBB」と入力しました。

コマンドボタン「cmdコマンド」クリック時にメッセージボックスを出すようにしました。
Protected Sub cmdコマンド_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdコマンド.Click
MsgBox(Me.txtテキスト.Text)
End Sub

するとメッセージボックスは「BBB」ではなく「AAA」と出ます。
これが「BBB」と出るようにできれば解決しそうです。
よろしくお願いいたします。

引用返信 編集キー/
■26807 / inTopicNo.7)  Re[6]: データベースの更新処理で行き詰りました。
□投稿者/ aetos(旧シャノン) (19回)-(2008/10/21(Tue) 14:41:29)
リンクしておきますね
http://hpcgi1.nifty.com/MADIA/vbnet/wwwlng.cgi?print+200810/08100019.txt
引用返信 編集キー/
■26808 / inTopicNo.8)  Re[6]: データベースの更新処理で行き詰りました。
□投稿者/ Tram (9回)-(2008/10/21(Tue) 14:41:46)
Page_Loadの中で、ポストバックかどうかを判定してあげればよいかと。
ここら辺あたりを読んでみてください。
http://www.atmarkit.co.jp/fdotnet/aspnet/aspnet03/aspnet03_02.html
引用返信 編集キー/
■26810 / inTopicNo.9)  Re[7]: データベースの更新処理で行き詰りました。
□投稿者/ ながなが (7回)-(2008/10/21(Tue) 14:56:45)
ありがとうございました。
読込時イベントではなく読込完了時イベントに変更すれば解決しました。
ありがとうございます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -