- PR -

OracleのLONG RAW型のデータ更新について

1
投稿者投稿内容
mal
会議室デビュー日: 2005/10/12
投稿数: 6
投稿日時: 2005-10-12 14:18
始めましてmalと申します。

現在、VB.net + ASP.NETを使用して開発を行っています。
あるテーブルの更新を行いたいのですが
テーブル内にLongRaw型のデータが存在するためうまく
更新することができません。

最初は、ODP.netのOracleDataAdapterを使用して
更新を試みましたが、更新することができず。

過去ログ
を参考に作成してみましたが、
「パラメータ・バインディングが無効です。パラメータ名 : N7」のエラーが表示します。

色々試してみたのですが、
これ以上、私の力ではどうにもなりません。
ご存知の方、いらっしゃいましたら
何卒よろしくお願い致します。

ちなみに、どちらの方法もLongRaw型の
データ更新対象外にするとデータの更新はうまく行きます。

−<OracleDataAdapter使用>−−−−−−−−−−−−−−−−−
  strCnPrm = "Data Source=AAA;" & _
"User ID=BBB;" & _
"Password=BBB"

'Oracleへ接続
cnn = New OracleConnection(strCnPrm)
cnn.Open()

Dim Buff As Byte
Dim MyDouble As Double

MyDouble = 123
Buff = CByte(MyDouble)

Dim orTran As OracleTransaction = cnn.BeginTransaction

myRow = dSet_gr.Tables("t_name").NewRow()
    ※f2〜f6にもデータ代入
myRow.Item("N1") = Buff

dSet_gr.Tables("t_name").Rows.Add(myRow)
    cbr = New OracleCommandBuilder(dap)
    dap.Update(dSet_gr, "t_name")
   cnn.Close()


−<過去ログ参考>−−−−−−−−−−−−−−−−−
  strCnPrm = "Data Source=AAA;" & _
"User ID=BBB;" & _
"Password=BBB"

'Oracleへ接続
cnn = New OracleConnection(strCnPrm)
cnn.Open()

Dim orTran As OracleTransaction = cnn.BeginTransaction

Dim strSql As String = "INSERT INTO t_name(N1,N2,N3,N4,N5,N6,N7)" & _
" VALUES (:f1, :f2, :f3, :f4, :f5, :f6, :f7)"

Dim cmd As OracleCommand = New OracleCommand
cmd.Connection = cnn
cmd.CommandText = strSql

Dim f1 As OracleParameter =
cmd.Parameters.Add("N1", OracleDbType.Char,
      ParameterDirection.InputOutput)
※f2〜f6も同様

Dim f7 As OracleParameter =
     cmd.Parameters.Add("JLG_LOG_DAT", OracleDbType.LongRaw)

f1.Value = "00000000" ※f2〜f6にもデータ代入


Dim Buff As Byte
Dim MyDouble As Double

MyDouble = 123
Buff = CByte(MyDouble)
f7.Value = Buff


cmd.ExecuteNonQuery()
orTran.Commit()
   cnn.Close()
−−−−−−−−−−−−−−−−−−−−−−−−−


・開発環境
言語: VisualStudio.NET 2003
VB.net + ASP.NET
OS: Windows2000(SP4)

・サーバー環境
OS: Windows Server 2003 Enterprise
DB: Oracle 10.1.0
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-10-13 07:52
引用:

malさんの書き込み (2005-10-12 14:18) より:
コード:
Dim Buff As Byte
Dim MyDouble As Double

MyDouble = 123
Buff = CByte(MyDouble)
f7.Value = Buff




過去ログではBYTE型配列を与えていたはずです。貴方のコードでは、BYTE型の数値になってますよね。その辺りが原因では?BYTE型配列を与えるようにしても、結果は変わらないですか?
mal
会議室デビュー日: 2005/10/12
投稿数: 6
投稿日時: 2005-10-13 09:45
おはようございます。
甕星さんお返事ありがとうございます。

BYTE型配列でも試したのですが、関係ない様です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-13 10:09
こんにちは、じゃんぬ です。

引用:

malさんの書き込み (2005-10-13 09:45) より:

BYTE型配列でも試したのですが、関係ない様です。


ところで OleDb だと通ったりしません?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-10-13 10:55
引用:

malさんの書き込み (2005-10-13 09:45) より:
おはようございます。
甕星さんお返事ありがとうございます。

BYTE型配列でも試したのですが、関係ない様です。



「Byte配列でも関係ない」のか気になったので、以下のコードで実験してみました。

テスト用としてTestというテーブルを作成し、
列はLongRaw型のcol1という列があるのみです。

実行環境は
WinXP,
VisualStudio.NET 2003
Oracle9iR2
です。

コード:

conn = New OracleConnection(connectionString)
conn.Open()
Dim orTran As OracleTransaction = conn.BeginTransaction

Dim cmd = New OracleCommand
cmd.Connection = conn
cmd.CommandType = CommandType.Text
cmd.CommandText = "insert into Test(col1) values(:col1v) "

Dim str1 = "col1v"
Dim val As String = "0"
Dim barray() As Byte = {1, 2, 3, 4, 5, 6, 7, 9}

Dim f7 As OracleParameter = _
cmd.Parameters.Add(str1, OracleDbType.LongRaw)

f7.Value = barray

cmd.ExecuteNonQuery()
orTran.Commit()
conn.Close()
conn = Nothing



実行は正常終了し、
データは「0102030405060709」が入っていました。

#編集追加
ConnectionとCommandのDispose忘れてますね、自分。
#ソースは失念した状態で残しますがご容赦くださいませ。

[ メッセージ編集済み 編集者: 夏椰【SUICA】 編集日時 2005-10-13 11:30 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-13 11:19
私も気になったので検証していたのですが、先を越されました。(^^;)
でも、一応アップしておきます。

コード:

Private Shared Sub OneMethod()
    Dim hConnection As OracleConnection

    Try
        hConnection = New OracleConnection("...")

        Try
            Dim hCommand As OracleCommand

            Try
                hCommand = New OracleCommand("INSERT INTO HOGE(COL1), VALUES(:HogeValue)", hConnection)

                hCommand.Parameters.Add("HogeValue", OracleType.LongRaw).Value = New Byte() {6, 2, 9, 5}
                hCommand.ExecuteNonQuery()
            Finally
                If hCommand Is Nothing Then
                    hCommand.Dispose()
                End If
            End Try
        Finally
            If Not hConnection Is Nothing Then
                hConnection.Close
            End If
        End Try
    Finally
        If Not hConnection Is Nothing Then
            hConnection.Dispose()
        End If
    End Try
End Sub


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
mal
会議室デビュー日: 2005/10/12
投稿数: 6
投稿日時: 2005-10-13 13:17
私のために時間を割いてくださった
皆様ありがとうございました。

LongRow型に別の変数を代入しておりました。
(昨日、レス時点するまではBuffを代入していたのですが・・・。)
お恥ずかしい限りです。

本当にありがとうございました。
1

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