DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データベースの特定フィールドへの書込み読込

環境/言語:[XP,.NET]
分類:[.NET]

現在、OSはXPで、.NET2003 データベースMSDEにてソフト開発をしております。どなたか以下の内容についてご教授ください!!!

行いたいこと:

A-Tableの“規格コード”と言うフィールドに格納されている番号を読み込み、その番号に対応した2種類(色、素材)の数値データを管理しているB-Tabeleよりデータを引張ってきて、A-Tableの専用フィールド(色、素材)に格納する。

以上


今までは、規格コードを用いて2種類のテーブルで管理をしていたのですが、規格コードを無くし1つのTABLEでデータの管理を行いたいためです。


もしくは、2種類のテーブルを結合し、その状態のデータをCSV or TEXTにて吐き出す方法も方法をご存知の方が居ましたら合わせて教えてください!!!

現在勉強中です…。宜しくお願いいたします。
こういう感じのSQLを知りたいとおっしゃっていますか?


==================================================
A-Table
規格コード | 色 | 素材
-------------------------
001 | NULL | NULL
002 | NULL | NULL
003 | NULL | NULL
004 | NULL | NULL
005 | NULL | NULL

B-Table
規格コード | 色 | 素材
-------------------------
001 | 赤 | 木
002 | 緑 | 布
003 | 青 | 鉄


[SQL]
update A
set A.色 = b.色 , A.素材 = B.素材
FROM "A-Table" A ,"B-Table" B
WHERE
B.規格コード = A.規格コード

[結果]
A-Table
規格コード | 色 | 素材
-------------------------
001 | 赤 | 木
002 | 緑 | 布
003 | 青 | 鉄
004 | NULL | NULL
005 | NULL | NULL
ありがとうございます!
そして、今は、規格コードTableのデータを構造体に読み込もうとしているのですが、“dr”にデータがうまく格納されず、※の部分で“オブジェクト参照がオブジェクトインスタンスに設定されていません”とエラーが出てしまいます…。

構文は以下のものです。
ありがとうございます!
そして、今は、規格コードTable(B-TABLE)のデータを構造体に読み込もうとしているのですが、“dr”にデータがうまく格納されず、※の部分で“オブジェクト参照がオブジェクトインスタンスに設定されていません”とエラーが出てしまいます…。

構文は以下のものです。基本的なことで申し訳ありませんが教えてください…。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim cmd As SqlClient.SqlCommand = SqlConnection1.CreateCommand()
Dim dr As SqlClient.SqlDataReader
Dim i As Integer


'コマンドのコネクション設定
cmd.Connection = SqlConnection1

'コネクションを開く
SqlConnection1.Open()

'コマンドの定義
cmd.CommandText = "SELECT Standard, AN_up, AN_down, OHV_up, OHV_down FROM tbl_temp_standard_data"

'データリーダからのデータの読出し
dr = cmd.ExecuteReader()

i = 1

Do While dr.Read = True
※ StandardData(i).Standard = dr.Item("Standard")
StandardData(i).AN_up = dr.Item("AN_up")
StandardData(i).AN_down = dr.Item("Standard")
StandardData(i).OHV_up = dr.Item("AN_down")
StandardData(i).OHV_down = dr.Item("OHV_down")
i = i + 1
Loop

End Sub
StandardDataはどこで作られているんでしょうか?
Public Class LastDataEdit
Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "

Public Sub New()
MyBase.New()

' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後に初期化を追加します。

End Sub

' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer

' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
'Windows フォーム デザイナを使って変更してください。
' コード エディタを使って変更しないでください。
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents SqlConnection1 As System.Data.SqlClient.SqlConnection
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.SqlConnection1 = New System.Data.SqlClient.SqlConnection
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(40, 160)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(216, 72)
Me.Button1.TabIndex = 0
Me.Button1.Text = "Button1"
'
'SqlConnection1
'
Me.SqlConnection1.ConnectionString = "workstation id=HIS0164;packet size=4096;integrated security=SSPI;data source=HIS0" & _
"164;persist security info=False;initial catalog=spc"
'
'LastDataEdit
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.Add(Me.Button1)
Me.Name = "LastDataEdit"
Me.Text = "LastDataEdit"
Me.ResumeLayout(False)

End Sub

#End Region
'規格データの格納用
Public Structure DataFields
Public Standard As String
Public AN_up As String
Public AN_down As String
Public OHV_up As String
Public OHV_down As String
End Structure

'動的配列宣言::::::::::::::::::::::::::::ここです!!!!!!
Dim StandardData() As DataFields


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim cmd As SqlClient.SqlCommand = SqlConnection1.CreateCommand()
Dim dr As SqlClient.SqlDataReader
Dim i As Integer


'コマンドのコネクション設定
cmd.Connection = SqlConnection1

'コネクションを開く
SqlConnection1.Open()

'コマンドの定義
cmd.CommandText = "SELECT Standard, AN_up, AN_down, OHV_up, OHV_down FROM tbl_temp_standard_data"

'データリーダからのデータの読出し
dr = cmd.ExecuteReader()

i = 1

Do While dr.Read = True
StandardData(i).Standard = CStr(dr("Standard"))
StandardData(i).AN_up = CStr(dr("AN_up"))
StandardData(i).AN_down = CStr(dr("Standard"))
StandardData(i).OHV_up = CStr(dr("AN_down"))
StandardData(i).OHV_down = CStr(dr("OHV_down"))
i = i + 1
Loop

End Sub

End Class
すみません!!

redimし忘れていました!!

また、データが<NULL>なフィールドがあり、エラーになってしまいました。
データベースの型はdecimalで、構造体はstringです。stringをcharaにしておかないとだめなのでしょうか???

教えてください!!!
Decimalで受け取って文字列にしたらいいんじゃないですか?
http://msdn2.microsoft.com/ja-jp/library/system.decimal_members(VS.80).aspx

あとはDBNullの時に何を設定するかをハンドリングしたりするのかな?

> あとはDBNullの時に何を設定するかをハンドリングしたりするのかな?

if文でハンドリング使用と思うんですが、<null>を条件で書くための文法がわかりません・・・・。試しても、エラーです。。
■No15930に返信(nakaさんの記事)
>
>>あとはDBNullの時に何を設定するかをハンドリングしたりするのかな?
>
> if文でハンドリング使用と思うんですが、<null>を条件で書くための文法がわかりません・・・・。試しても、エラーです。。
>
>

If dr("OHV_up") = "DBnull" Then
現在はこんな風に書いています。でも、エラーです。。。。。
いや、DBNullってクラスがいるんですよ。

http://msdn2.microsoft.com/ja-jp/library/system.dbnull_members.aspx
■No15932に返信(夏椰さんの記事)
> いや、DBNullってクラスがいるんですよ。
>
> http://msdn2.microsoft.com/ja-jp/library/system.dbnull_members.aspx
>

ページを見てみましたがさっぽろ分かりません…。
何か、例は無いでしょうか?

素人質問でお恥ずかしいですが…。
>If dr("OHV_up") = "DBnull" Then

って dr("OHV_up")と"DBnull"って文字列を比較しているじゃないですか。

そうではなくて、NULLの場合、DBNullって値が返ってくるんですよ。
なので、DBNull.Value.Equals(dr("OHV_up")) がTRUEの場合
値がNULLということになります。
ありがとうございました!!!
出来ました!!!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板