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

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

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

Re[8]: OracleでのSQL


(過去ログ 25 を表示中)

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

■11536 / inTopicNo.1)  OracleでのSQL
  
□投稿者/ BAW (5回)-(2007/12/17(Mon) 16:40:23)

分類:[VB.NET/VB2005] 

いつもお世話になっております。
環境:	Windows2000Pro
	VB.NET2002
	Oracle 10g
にて、既存のシステムの修正開発を行っております。

以下のソースにしたところ、例外が発生して悩んでおります。

'System.Data.OleDb.OleDbException' のハンドルされていない例外がsystem.data.dllで発生しました

とダイアログが表示されます。
Msgboxを表示させ、例外のメッセージを表示させたところ
'ORA-01036: illegal variable name/number'
とありました。

追加したパラメータをコメントアウトすれば、処理は通るため、
パラメータ指定に問題があるのかと考えていました。
実際に見直したところ、変数の間違いはないように思えます。

なにかヒントをご提示いただけたら幸いです。

以下該当する処理です。

処理部
    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        Me.Cursor = Cursors.WaitCursor
        Dim params As New ArrayList()
        Dim souhin_kb As String
        Dim branch As String

	souhin_kb と branch の取得処理
	この値は狙ったとおりの値を取得しています。

        params.Add(New OleDbParameter("PSOUHIN_KB", souhin_kb))
        params.Add(New OleDbParameter("PBRANCHCODE", branch))             <=このパラメータを新たに追加したところエラー
        params.Add(New OleDbParameter("PFROMDATE", fromDate.Value))
        params.Add(New OleDbParameter("PTODATE", toDate.Value))
        Dim ds As DataSet = DBOraUtil.getDataSet("P_JYUCYU_ME.findUnensure", "curunensure", params, "unfinished")
        Dim rpt As New unfinishedReport()
        rpt.SetDataSource(ds)
        viewer.ReportSource = rpt
        Me.Cursor = Cursors.Default
    End Sub

        Public Shared Function getDataSet(ByVal procName As String, ByVal cursorName As String, ByVal parameters As ArrayList, ByVal name As String) As DataSet
            Dim cmd As OleDbCommand = makeCommand(procName, cursorName, parameters)
            Dim ds As New DataSet()
            Dim da As New OleDbDataAdapter()
            da.SelectCommand = cmd
            Try
                da.Fill(ds, name)		<=ここでエラー
            Catch ex As Exception
                MsgBox("error:" & ex.Message)
            End Try
            cmd.Parameters.Clear()
            Return ds
        End Function

        Private Shared Function makeCommand(ByVal procName As String, ByVal cursorName As String, ByVal parameters As ArrayList, Optional ByVal index As Integer = 0) As OleDbCommand
            Dim cmd As New OleDbCommand()
            With cmd
                Dim sb As New StringBuilder()
                sb.Append("{call " & procName & "({resultset 0, " & cursorName & "}")
                If Not (parameters Is Nothing) Then
                    Dim i As Integer
                    Dim l As Integer = parameters.Count - 1
                    For i = 0 To l
                        sb.Append(",?")
                        .Parameters.Add(parameters.Item(i))
                    Next
                End If
                sb.Append(")}")
                .CommandText = sb.ToString
                .Connection = DBOraUtil.getConnection(index)
            End With
            Return cmd
        End Function


OracleのSQL文
	プロシジャーの宣言部
	procedure findUnensure(curunensure in out curunensure, psouhin_kb in varchar2, pbranchCode in varchar2, pfromDate in date, ptoDate in date);

	実行SQL部
	procedure findUnensure(curunensure in out curunensure, psouhin_kb in varchar2, pbranchCode in varchar2,	pfromDate in date, ptoDate in date) as
	begin
		open curunensure for
		SELECT		mi.branchCode,
					mi.userid,
					mi.name,
					to_char(mi.hiduke, 'YYYY/MM/DD') hiduke,
					to_char(mi.jikan, 'HH24:MI:SS') jikan,
					me.jyucyu_no_lin,
					me.isbn,
					me.title,
					me.pub,
					me.jyucyu_suu,
					me.jyucyu_del_suu,
					me.b_nouhin_suu,
					me.jyucyu_zan,
					me.hikiate_suu,
					b.branchName
		FROM		jyucyu_me me
		LEFT JOIN	jyucyu_mi mi
		ON			mi.jyucyu_no = me.jyucyu_no
		LEFT JOIN	webUser u
		ON			u.userID = mi.userID
		LEFT JOIN	branch b
		ON			b.branchCode = mi.branchCode
		WHERE		mi.souhin_kb LIKE psouhin_kb
		AND			mi.branchCode LIKE pbranchCode  	<=追加した部分
		AND			me.k_haccyu_suu < (me.jyucyu_zan - me.hikiate_suu)
		AND			to_date(to_char(mi.hiduke, 'YYYY/MM/DD') || ' ' || to_char(mi.jikan, 'HH24:mi:ss'), 'YYYY/MM/DD hh24:mi:ss') between pfromDate and ptoDate
		AND			me.vendor = 'j'
		ORDER BY	mi.branchCode,
					me.jyucyu_no_lin;
	EXCEPTION
		WHEN OTHERS THEN
			p_errorLog.entry('p_jyucyu_me.findUnensure', sqlErrm);
			raise;
	end;

見づらいかとは思いますが、よろしくお願いいたします。

引用返信 編集キー/
■11540 / inTopicNo.2)  Re[1]: OracleでのSQL
□投稿者/ HiJun (84回)-(2007/12/17(Mon) 17:35:29)
気になっているのが...
1.まず、バインド変数名“PBRANCHCODE”を別の処理にて立てたままにしていませんか?
(ちゃんと解放していない場合が考えられます。)
2.実は、テーブル内のカラム名にPBRANCHCODEが存在しているということはありませんか?

私的には、OleDbを使用するよりは、ODP.NETを使用したほうが良いかなと...
引用返信 編集キー/
■11541 / inTopicNo.3)  Re[2]: OracleでのSQL
□投稿者/ BAW (6回)-(2007/12/17(Mon) 17:45:15)
返信ありがとうございます。

> 1.まず、バインド変数名“PBRANCHCODE”を別の処理にて立てたままにしていませんか?
> (ちゃんと解放していない場合が考えられます。)

今回の修正にて初めて使用した変数ですので別の処理に使っているということはないと思います。

> 2.実は、テーブル内のカラム名にPBRANCHCODEが存在しているということはありませんか?
>

全テーブル内にご指摘のカラム名は存在しておりません。

> 私的には、OleDbを使用するよりは、ODP.NETを使用したほうが良いかなと...

そうしたいんですが、ここ一部だけ使用してしまうと、ほとんどの処理で改修しなくちゃいけなくなるんですorz
#修正要望だけの案件ですので、そこまではできないそうです
引用返信 編集キー/
■11547 / inTopicNo.4)  Re[3]: OracleでのSQL
□投稿者/ はつね (372回)-(2007/12/17(Mon) 19:22:45)
はつね さんの Web サイト
No11541 (BAW さん) に返信
>>私的には、OleDbを使用するよりは、ODP.NETを使用したほうが良いかなと...
>
> そうしたいんですが、ここ一部だけ使用してしまうと、ほとんどの処理で改修しなくちゃいけなくなるんですorz
> #修正要望だけの案件ですので、そこまではできないそうです

OleDbだからはまっているように思えます(BindByNameがないので)。
SQL文の?の位置とParametersにAddする順番は意図したものになっていますか?
また、SQL文中の?の個数とParametersの個数はあっていますか?
エラーが出た時点でのda.SelectCommand.CommandTextの内容とParametersのバインド変数名の一覧を確認できますでしょうか?


引用返信 編集キー/
■11574 / inTopicNo.5)  Re[4]: OracleでのSQL
□投稿者/ BAW (7回)-(2007/12/18(Tue) 09:22:20)
返信遅れまして申し訳ありません。
ヒントのご提示ありがとうございます。

> SQL文の?の位置とParametersにAddする順番は意図したものになっていますか?
cmd.CommandText "{call P_JYUCYU_ME.findUnensure({resultset 0, curunensure},?,?,?,?)}" String
となっており、
> また、SQL文中の?の個数とParametersの個数はあっていますか?
Parametersの個数・バインド変数名・変数の値、すべて意図したとおりのものが入っております。

> エラーが出た時点でのda.SelectCommand.CommandTextの内容とParametersのバインド変数名の一覧を確認できますでしょうか?
>

上述の文字列・パラメータが入っております。


> OleDbだからはまっているように思えます(BindByNameがないので)。
この部分だけODP.NETを使うのは後々のメンテナンスで可読性が低くなりそうなので躊躇っていましたが
一度試してみようと思います。

ありがとうございました。
#そもそものクライアントから提示されたソースコードにコメントがまったくなく、
#解析に時間がかかった経緯があるのでこれ以上複雑にするなって言われてるんですよね。
#すいません、愚痴です、忘れてください。

引用返信 編集キー/
■11580 / inTopicNo.6)  Re[5]: OracleでのSQL
□投稿者/ はつね (373回)-(2007/12/18(Tue) 10:29:01)
はつね さんの Web サイト
No11574 (BAW さん) に返信
>>SQL文の?の位置とParametersにAddする順番は意図したものになっていますか?
> cmd.CommandText "{call P_JYUCYU_ME.findUnensure({resultset 0, curunensure},?,?,?,?)}" String
> となっており、
> Parametersの個数・バインド変数名・変数の値、すべて意図したとおりのものが入っております。

つまり、(0)、(1)、(2)、(3)に"PSOUHIN_KB"、,"PBRANCHCODE","PFROMDATE","PTODATE"が対応しているって事ね。
あと、cmd.CommandTypeはどうなってます?

引用返信 編集キー/
■11585 / inTopicNo.7)  Re[6]: OracleでのSQL
□投稿者/ BAW (8回)-(2007/12/18(Tue) 11:57:51)
> つまり、(0)、(1)、(2)、(3)に"PSOUHIN_KB"、,"PBRANCHCODE","PFROMDATE","PTODATE"が対応しているって事ね。

そのとおりです。

> あと、cmd.CommandTypeはどうなってます?

申し訳ありません、ODP.NETをDL・インストールを行ったところ、DBに接続できなくりましたorz
現在原因を探っているところでありますので、回復しだい返答させていただきます。

貴重なお時間を割いていただきありがとうございます。
引用返信 編集キー/
■11587 / inTopicNo.8)  Re[7]: OracleでのSQL
□投稿者/ BAW (9回)-(2007/12/18(Tue) 12:19:28)
お待たせいたしました。

>>あと、cmd.CommandTypeはどうなってます?

Textとなっております。

引用返信 編集キー/
■11611 / inTopicNo.9)  Re[8]: OracleでのSQL
□投稿者/ やじゅ (24回)-(2007/12/18(Tue) 23:16:14)
やじゅ さんの Web サイト
No11587 (BAW さん) に返信

型はあっているのでしょうか?
数値型に文字型が入っているとか、またはその逆とか
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -