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

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

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

Re[6]: vb.net MDB内のテーブルAからテーブルBに列の移動


(過去ログ 120 を表示中)

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

■72135 / inTopicNo.1)  vb.net MDB内のテーブルAからテーブルBに列の移動
  
□投稿者/ toku41 (4回)-(2014/05/20(Tue) 19:02:52)

分類:[.NET 全般] 

vb.net 2008 とデーターベース(MDB)を よく理解しないまま
やりたいことを検索しながら作り始めて1ヶ月半です。

先日、つたない質問にお答えいただき、味を占めて質問させていただきます。

1つのデーターベース(MDB)内で
テーブルAは現在編集中のデーターとし
テーブルBに完了したデーターを移動したいと思い
(テーブルAのテーブル構成のみコピーしたテーブルBに1つの列の移動)
検索しましたが、わかりやすいサンプルが無かったので試行錯誤しました。

自分の分かる範囲で、ソースをくみ目的は果たしましたが、
もっとシンプルで早い方法があったら、教えていただけたら幸いです。

以下、命令の使い方間違ってるかもしれないですが、ソース貼っておきます。


Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Database\DATA.mdb")
Dim SQLCm As OleDbCommand = Cn.CreateCommand
Cn.Open()

'DataGridViewレコード選択分(複数)繰り返し
For Each row As DataGridViewRow In Me.DataGridView1.SelectedRows

'DataGridView列0が主キー
Dim dgvID = Me.DataGridView1(0, row.Index).Value
Dim Read As String = dgvID.ToString
Dim Rcount As Integer = (DataGridView1.ColumnCount)

'テーブルBに主キーのみインサート
For Rcount = 1 To Rcount - 1
Read = Read + ",''"
Next
SQLCm.CommandText = "INSERT INTO [テーブルB] VALUES (" + Read + ")"
SQLCm.ExecuteNonQuery()

'テーブルBに列データー追加
For Rcount = 1 To Rcount - 1

'DataGridView列ヘッダーの文字列を変更しているためNameから抜き出し
Dim HeaderName = DataGridView1.Columns(Rcount).DataPropertyName

Read = (DataGridView1(Rcount, row.Index).Value)
If Read <> "" Then
SQLCm.CommandText = "UPDATE [テーブルB] SET [" + HeaderName + "] = '" + Read + "' WHERE ID = " + dgvID.ToString
SQLCm.ExecuteNonQuery()
End If

Next
'DataGridViewから削除
DataGridView1.Rows.RemoveAt(row.Index)

Next

Try
'mdbから削除
Me.Validate()
Me.テーブルABindingSource.EndEdit()
Me.テーブルATableAdapter.Update(Me.UpDatasDataSet.テーブルA)
' MsgBox("Update successful")
Catch ex As Exception
MsgBox("データーの記録に失敗")
End Try
Cn.Close()
引用返信 編集キー/
■72141 / inTopicNo.2)  Re[1]: vb.net MDB内のテーブルAからテーブルBに列の移動
□投稿者/ WebSurfer (259回)-(2014/05/21(Wed) 10:13:48)
No72135 (toku41 さん) に返信

Visual Studio のデータソース構成ウィザードを使って作る DB の編集・更新用のアプリの
基本的な構成は理解していて、その上で質問されているのでしょうか?

やりたいことは、

(1) 「テーブルA」の編集・更新。
(2) 更新済みの「テーブルA」の内容を「テーブルB」にコピー。
(3) 上記 (1) と (2) を同時に行いたい。

のどれでしょう?

自分的には (3) はあり得ず、(1) で十分と思うのですが? (2) はバックアップ等の理由で
必要なら (1) が終わってから別の手段でやるのがいいのではないですか?
引用返信 編集キー/
■72142 / inTopicNo.3)  Re[2]: vb.net MDB内のテーブルAからテーブルBに列の移動
□投稿者/ toku41 (5回)-(2014/05/21(Wed) 11:48:32)
2014/05/21(Wed) 11:53:42 編集(投稿者)
2014/05/21(Wed) 11:51:43 編集(投稿者)

No72141 (WebSurfer さん) に返信

返信ありがとう御座います。

Visual Studioや Microsoft Accessの基本的なことは全部すっとぱして
ぶっつけ本番で作ってます。
ひとつの命令書いて、デバックで動かしてみて、エラーや目的と違うなら
サンプル検索して、修正しての繰り返しで、ここまで来ました。

命令文なども理解したというより、ネットのサンプルを切り貼りしてたら
出来てしまったという感じです


> やりたいことは、
>
> (1) 「テーブルA」の編集・更新。
> (2) 更新済みの「テーブルA」の内容を「テーブルB」にコピー。
> (3) 上記 (1) と (2) を同時に行いたい。
>
> のどれでしょう?

(2) です。
「テーブルB」はバックアップというより過去データーの保存で
過去データーを参照するときに使います。
「テーブルA」の内容を「テーブルB」まるまるコピーでは無く
1つのレコードのみ移動したいのです。
「テーブルA」現在の友達,住所,氏名,電話,誕生日....
「テーブルB」過去の友達,住所,氏名,電話,誕生日....
のような感じです

>(1) 「テーブルA」の編集・更新。
は、合理的なのかは分かりませんが、とりあえずできます。

説明が不足とは思いますが、よろしくお願いいたします。
引用返信 編集キー/
■72144 / inTopicNo.4)  Re[3]: vb.net MDB内のテーブルAからテーブルBに列の移動
□投稿者/ WebSurfer (260回)-(2014/05/21(Wed) 13:57:02)
No72142 (toku41 さん) に返信
> (2) です。

気がついた点を書きます。ご参考まで。

(1) 選択された各行のデータは、各行にバインドされた DataRowView オブジェクトの
  Item プロパティを使って取得する。

以下のページを参考にしてください。DataTable を DataGridView のデータソースとし
ていれば、row.DataBoundItem で取得できるのは DataRowView( Customer ではなく)
になるはずです。

方法 : Windows フォームの DataGridView 行にバインドされたオブジェクトにアクセスする
http://msdn.microsoft.com/ja-jp/library/4wszzzc7(v=vs.110).aspx

(2) 主キーのみ先に INSERT してから、その他のフィールドを UPDATE しているのはど
  ういう理由でしょう? 主キーを含めた全てのフィールドを一度に INSERT すれば
  済むはずですが。

(3) クエリはパラメータ化する。

(4) コネクションリークを防ぐ対策をとる。詳しくは以下のページを参照してください。

.NETの例外処理 Part.2
http://blogs.msdn.com/b/nakama/archive/2009/01/02/net-part-2.aspx

引用返信 編集キー/
■72147 / inTopicNo.5)  Re[4]: vb.net MDB内のテーブルAからテーブルBに列の移動
□投稿者/ toku41 (6回)-(2014/05/21(Wed) 14:39:20)
2014/05/21(Wed) 14:40:55 編集(投稿者)

No72144 (WebSurfer さん) に返信

返信ありがとう御座います。

>(2) 主キーのみ先に INSERT してから、その他のフィールドを UPDATE しているのはど
>  ういう理由でしょう? 主キーを含めた全てのフィールドを一度に INSERT すれば
>  済むはずですが。

コレは、DatagridViewの列をそのまま順番に読み込んでインサートしたら
列並びが「テーブルA」の列並びが違うので
ループを2回使うのもどうかとは思いましたが
列Header名でUPDATEしてやった方が順番を気にしなくて良いと思ったからです。

どこいら辺を学習したら良いのか指標をいただき、ありがとう御座います。

ギアの入れ方も分からず路上に出てしまった様な私に、参考となるURLまで
提示していただき、感謝いたしております。

引用返信 編集キー/
■72149 / inTopicNo.6)  Re[5]: vb.net MDB内のテーブルAからテーブルBに列の移動
□投稿者/ WebSurfer (261回)-(2014/05/21(Wed) 15:14:52)
No72147 (toku41 さん) に返信

> コレは、DatagridViewの列をそのまま順番に読み込んでインサートしたら
> 列並びが「テーブルA」の列並びが違うので
> ループを2回使うのもどうかとは思いましたが
> 列Header名でUPDATEしてやった方が順番を気にしなくて良いと思ったからです。

そもそも、DB のテーブル内でのレコードの並び順序などユーザーは一切気にする
必要のないものです。

SELECT クエリで取得してくる時に ORDER BY 句を使って希望の順序に並び替える
のが基本です。
引用返信 編集キー/
■72155 / inTopicNo.7)  Re[6]: vb.net MDB内のテーブルAからテーブルBに列の移動
□投稿者/ toku41 (7回)-(2014/05/21(Wed) 17:04:33)
2014/05/21(Wed) 19:58:50 編集(投稿者)
2014/05/21(Wed) 17:09:09 編集(投稿者)

No72149 (WebSurfer さん) に返信
>
> そもそも、DB のテーブル内でのレコードの並び順序などユーザーは一切気にする
> 必要のないものです。
>
> SELECT クエリで取得してくる時に ORDER BY 句を使って希望の順序に並び替える
> のが基本です。

基礎の基礎から学ばないとですね...
先ほど教えていただいたリンク先やご指示をまだ理解してないのですが...

質問しようと思ったのは、結果は出来たけどアプローチ間違ってるし
回りくどいソースだと自覚していたからなのですが
自分でこねくり回しているウチに、少し良くなった(?)気がします。

現状は下記のソースになりましたが
ご指摘・教えを再考し、もう少しVB dbの理解を深めてみます

Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Database\DATA.mdb")
Dim SQLCm As OleDbCommand = Cn.CreateCommand
Dim da As New OleDbDataAdapter("SELECT * FROM テーブルA", Cn)
Dim dt As New DataTable
da.Fill(dt)
Cn.Open()
For Each row As DataGridViewRow In Me.DataGridView1.SelectedRows
'DataGridView列0が主キー
Dim dgvID = Me.DataGridView1(0, row.Index).Value
'テーブルAから配列取得
Dim newData = dt.Select("ID = '" + dgvID.ToString + "'")
Dim olddataLen = newData(0).ItemArray.Length

Dim olddata As String = dgvID.ToString
For k = 1 To olddataLen - 1
olddata = olddata + ",'" + newData(0).ItemArray(k).ToString + "'"
Next

'テーブルBにインサート
SQLCm.CommandText = "INSERT INTO テーブルB VALUES (" + olddata + ")"
SQLCm.ExecuteNonQuery()

'DataGridViewから削除
DataGridView1.Rows.RemoveAt(row.Index)
Next
Cn.Close()
Try
'mdbから削除
Me.Validate()
Me.テーブルABindingSource.EndEdit()
Me.テーブルATableAdapter.Update(Me.UpDatasDataSet.テーブルA)
My.Computer.Audio.Play("./item/ok.wav", AudioPlayMode.Background)
Catch ex As Exception
MsgBox("データーの記録に失敗")
End Try


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -