- PR -

OracleCommandBuilderについて

1
投稿者投稿内容
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-02-23 09:44
おはようございます。
いつもお世話になっております。

OracleCommandBuilderを使用したデータベースの更新処理を構築しようと考えているのですが、処理がうまく実行されず悩んでいます。

簡単にですが、処理を記述します。

============================================================

@データテーブル作成
'---Select文作成
Select * From Employees

'---データセットに取得
OraDA.Fill(dtSet,Employees)

'---データセットからテーブルを取得
dtTable = dtSet.Tables(Employees)

Aデータ追加
Dim dtRow as DataRow = dtTable.NewRow

'---データセット更新処理開始
dtRow.BeginEdit()

'---入力が空じゃなかったらデータベースにセット
If textbox1.Text = "" Then
dtRow("Name") = DBNull.Value
Else
dtRow("Name") = Trim(textbox1.Text)
End If

If textbox2.Text = "" Then
dtRow("Memo") = DBNull.Value
Else
dtRow("Memo") = Trim(textbox2.Text)
End If

dtTable.Rows.Add(dtRow)

'---データセット更新完了
dtRow.EndEdit

BDB更新
OraDA.Update(dtSet,Employees)

============================================================

この処理でMemoだけ、データベースにフル桁(桁数に満たない場合はブランクあり)で挿入されてしまいます。
ただし、未入力のときはNullになっています。

Nameの方は入力した文字だけDBに登録しています。

Bの直前にデータセットの内容をXMLにはき出してみたのですが、ブランクはなく、入力した値のみになっています。

修正処理も他で行っているのですが、このときはほぼ同じコーディングで、Memoを新規追加してもブランク付きで登録されることはありません。

おわかりになられる方がいらっしゃいましたらよろしくお願い致します。

(環境はVS.NET2003(SP2)、言語はVB.NETによるWindowsアプリケーションです。)
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-23 10:12
”Memo”のDBの定義型は
varchar2(可変長文字列)?
char(固定長文字列)?


[ メッセージ編集済み 編集者: xxななおxx 編集日時 2005-02-23 10:15 ]
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-02-23 10:45
xxななおxxさん、返信ありがとうございます。

"Memo"は CHAR(10) で定義されています。
"Name"は VARCHAR(20) で定義されています。

この違いってことですよね。
Accessにつなげてフィールドプロパティの確認はしていたのですが、Oracleで確認していませんでした。

DB定義が間違えていたということですよね。

Update文では上手くいくのはなぜでしょうか?
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-02-23 10:57
"Memo"の定義を VARCHAR2(10) に変更したところ、処理がうまくいきました。

xxななおxxさんありがとうございました。

すいません。
VARCHAR2型に変更しています。

[ メッセージ編集済み 編集者: TAKAMIKI 編集日時 2005-02-23 11:40 ]
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-23 11:19
Accessは知らないですが、
Oracleの仕様と言う方がいいですかね。
(他のDBもそうだと思ってましたけど・・)

char型は固定長なので、
char(n) nバイト以下で足りない場合にはOracleが空白をつけます。
nより大きい場合にはエラーになります。
これはADO.NETを経由せず、SQLプラスなどで更新しても同じです。

あんまり良い参照ではないですけど↓”■データ型”を読んでください。
http://www.mitene.or.jp/~rnk/TIPS_ORCL_TBLCREATE.htm

↓ちなみに”varchar”よりも”varchar2”をおすすめします。
http://www.oracle.co.jp/2shin/2002/ora56/18_19.html



[ メッセージ編集済み 編集者: xxななおxx 編集日時 2005-02-23 11:31 ]
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-02-23 11:39
xxななおxxさん、返信ありがとうございます。

私もChar型とVarChar2型について調べてみたのですが、Char型(固定長)だとスペースが付加されるようですね。

Char型の値に対し、実際に実行して確認してみたところ

・SQLプラスでUpdate文を発行すると、スペースが付加されました。

・OracleCommandBuilderでUpdate処理を行うと、スペースが付加されませんでした。

・Insert処理については、両者ともスペースが付加されました。

という結果になりました。

今回はVarChar2に変更したので問題ないのですが、少し気になるところです。
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-23 13:50
引用:


Char型の値に対し、実際に実行して確認してみたところ

・SQLプラスでUpdate文を発行すると、スペースが付加されました。

・OracleCommandBuilderでUpdate処理を行うと、スペースが付加されませんでした。



本題の問題は型変更で解決したようですか、↑がホントなら気になりますねぇ。

”スペースが付加されない”とおっしゃってるのはDBの値ですよね?
DBが固定長文字列で定義されてるのに
DBに可変長文字列として格納されるということですか?
それともスペースではなくて別の文字が入ってるということでしょうか?
うーーん。。??

こちらの環境で接続アダプターを
・System.Data.OracleClient
・Oracle.DataAccess.Client
の両方で試してみましたが、
OracleCommandBuilderを使用してUpdateしても、
DBがCHAR型なら普通に不足バイトにスペースが入った固定長になってますけど?
(環境:Oracle9.2.0.4.0 Windows2003Server VB.NET)
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-02-23 14:11
すいません・・・

私の勘違いでした。

xxななおxxさんのおっしゃるように
OracleCommandBuilderを使用してもDBがCHAR型なら普通に不足バイトにスペースが入った固定長になりました。

すいませんでした。
1

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