【5/28更新】回答が連続投稿される不具合について

お世話になります。

只今ExecuteSQLという関数を使って
INSERT文を発行しています。

ですが、この処理の後、ロールバックを行なって処理を取り消したいのですが、
ロールバックもうまく行かず、どうやらExecuteSQLを通った時に
既にINSERT文の内容がコミットされてしまっているのではないかと考えているのですが、どなたかご存知の方、アドバイスをお願い致します。

…MSDN見てもよくわからなかったので…

また、ロールバックするにはなにか別の方法がないかなどお聞かせ頂けたら幸いです。

A 回答 (1件)

ミドルウェア(ADO、DAOなど)を何を使ってられるのか書いていないので、はっきりは分かりませんが、トランザクションのはじめに、「Begin Trans」、コミットするときに「Commit Trans」、ロールバックするときには「Rollback Trans」と記載すれば大丈夫だと思います。


このあたりをキーワードにして、MSDN(DAOならDAOのヘルプ)を探していただければ、詳細があると思います。
    • good
    • 0
この回答へのお礼

Commit TransとRollback Transを書いたらうまくいくようになりました。

わかりやすく教えて頂いてありがとうございました。

お礼日時:2002/04/02 09:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL_VBAでOracleにADO接続してSQL文で追加/更新したい

EXCELで入力した値をADO接続して
SQL文で登録したいのですが 誰かサンプルソース
作成していただけないでしょうか?

Aベストアンサー

手抜きのような気もしますが…
Oracle OLACLEDBデータベースのSCOTTスキーマに「テスト」テーブルがある物とします。
NAME VARCHAR2
KOE VARCHAR2

Excelでは、ツール-参照設定で"Microsoft ActiveX Data Objects 2.0 Library"を参照します。

Module1を作成して、
↓ここから
Option Explicit

' ADOのオブジェクト変数を宣言
Private cnn As New ADODB.Connection
Private cmd As New ADODB.Command

Private Sub sTest()
On Error GoTo err_hdr
' Oracleの接続
cnn.Open "Provider=MSDAORA;" & _
"Data Source=ORACLEDB;", "SCOTT", "TIGER"
Set cmd.ActiveConnection = cnn
'追加の例
With cmd
.CommandText = "INSERT INTO テスト" _
& " (NAME , KOE)" _
& " VALUES ( '" & "ねこ" & "'" _
& " , '" & "にゃん" & "')"
.CommandType = adCmdUnknown
.Execute
End With
'更新の例
With cmd
.CommandText = "UPDATE テスト" _
& " SET テスト.NAME='" & "ねこ" & "'" _
& " , テスト.KOE='" & "にゃお~ん" & "'" _
& " WHERE " _
& " テスト.NAME='" & "ねこ" & "'" _
& " AND テスト.KOE='" & "にゃん" & "'"
.CommandType = adCmdUnknown
.Execute
End With
'削除の例
With cmd
.CommandText = "DELETE FROM テスト" _
& " WHERE " _
& " テスト.NAME='" & "ねこ" & "'" _
& " AND テスト.KOE='" & "にゃお~ん" & "'"
.CommandType = adCmdUnknown
.Execute
End With

cnn.Close

Set cmd = Nothing
Set cnn = Nothing
Exit Sub
err_hdr:
Resume Next
End Sub
↑ここまで

「ねこ」とかの代わりにExcelシート上のセルからデータを取得して
セットするように改造下さればなんとかなるかと思います。

手抜きのような気もしますが…
Oracle OLACLEDBデータベースのSCOTTスキーマに「テスト」テーブルがある物とします。
NAME VARCHAR2
KOE VARCHAR2

Excelでは、ツール-参照設定で"Microsoft ActiveX Data Objects 2.0 Library"を参照します。

Module1を作成して、
↓ここから
Option Explicit

' ADOのオブジェクト変数を宣言
Private cnn As New ADODB.Connection
Private cmd As New ADODB.Command

Private Sub sTest()
On Error GoTo err_hdr
' Oracleの接続
cnn.Open "Provider=M...続きを読む

Qupdate文で改行を入れる

こんにちは。
いつもお世話になっています。

update文を使用して、データに改行を入れたいのですが、どうすればよいでしょうか。

対象列のデータ型はVARCHAR2です。

例えばSQLPLUSから、
SPL>update 「テーブル名」set 「対象列」='あ改行い改行う改行'
を投入し、そのあと
select 「対象列」 from 「テーブル名」
とすると
SQL>あ
SQL>い
SQL>う
と出てくればよいんですが、
SQL>update 「テーブル名」set 「対象列」='あ\nい\nう\n'
としても
SQL>あ\nい\nう\n
と、「\n」が文字列としてでてきてしまいます。

SPL>update 「テーブル名」set 「対象列」='あ
2い
3う'
と投入すると、期待通りになるのですが、
そうではなく一行にまとめたいのですがどうすれば良いでしょうか。

Oracle9iを使用しています。
宜しくお願いいたします。

Aベストアンサー

こんにちわyukio200263さん
以下のSQL文でどうでしょうか?

UPDATE 「テーブル名」
SET 「対象列」= 'あ' || CHR(13) || CHR(10) ||'い'

ちょっと長くなってしまいますが、一行で可能です。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QOracleInProcServer.XOraSession オブジェクト作成時の参照ファイル

VBで OracleInProcServer.XOraSession を使い、
oracle9iのサーバーへ接続したいのですが、
現在10gのクライアントがインストールされており、
9iをインストールしてもサーバーへ接続できません。

レジストリを見るとoo4oは10gへ向いているようですが、9i用のDAOを利用したいです。

例えばOracleInProcServer.XOraSessionを利用したときに9iのoo4oを参照したいのですが、どのような方法があるでしょうか?

宜しくお願い致します。

Aベストアンサー

10gと9iの連携はしたことがありませんが、9iクライアントから8iサーバへの接続はしたことがあります。

サーバが9iだから9iクライアントを利用したいというだけであれば、10gクライアントからでも接続できませんか?

どうしても9iを利用したいのであれば、参照設定に入れてしまえばできませんか?
参照設定に
[OracleInProcServer X.X Type Library]
が二つ存在していませんか?

環境が無いままに話をしているので、想像で話をしております。すいません。

QVBでストアドの戻りパラメータを受け取る方法

VB6.0からADOを利用してSQLServerのストアドプロシージャを呼出し、戻りパラメータを受け取る方法がありましたら教えてください。よろしくお願いします!

CREATE PROC TEST
(
I_VAL AS INT,
O_VAL AS INT OUTPUT
)

~省略~

Aベストアンサー

#2のxcrOSgS2wYさんが飛ばしているリンク先の、.NETサンプルを書いた者です。

.NETからVB6へのコンバートをやってみました。
(いつもと逆方向への変換なので、違和感がありました^^;;;)

ストアドは、参考URLのまま利用しています。


Option Explicit

Sub Main()
  Const DEF_ストアド名 As String = "ストアド"
  
  Dim l_adoCnn  As ADODB.Connection
  Dim l_adoCmd  As ADODB.Command
  Dim l_adoRec  As ADODB.Recordset
  
  Set l_adoCnn = New ADODB.Connection
  Set l_adoCmd = New ADODB.Command
  
  'コネクション設定
  l_adoCnn.CursorLocation = adUseClient  '← これ重要、結構忘れられる。
  l_adoCnn.Open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=master;uid=sa;pwd=sa"
  
  With l_adoCmd
    'コネクションをコマンドに設定
    Set .ActiveConnection = l_adoCnn

    'コマンド種別 = ストアド
    .CommandType = adCmdStoredProc
    'ストアド名を指定
    .CommandText = DEF_ストアド名

    'パラメータ追加:戻り値
    .Parameters.Append パラメータ作成(l_adoCmd, "@戻り値", adInteger, 4, adParamReturnValue)

    'パラメータ追加:引数(I/I/O/IO)
    .Parameters.Append パラメータ作成(l_adoCmd, "@パラム1_VAR_I", adVarChar, 12, adParamInput, "abcde")
    .Parameters.Append パラメータ作成(l_adoCmd, "@パラム2_INT_I", adInteger, 4, adParamInput, 2)
    .Parameters.Append パラメータ作成(l_adoCmd, "@パラム3_VAR_O", adVarChar, 26, adParamOutput)
    .Parameters.Append パラメータ作成(l_adoCmd, "@パラム4_INT_IO", adInteger, 4, adParamInputOutput, 3)
  End With

  'ストアド実行
  Set l_adoRec = l_adoCmd.Execute
  

  '実行結果を出力
  Dim i As Integer
  Dim l_str結果 As String
  
  With l_adoCmd
    For i = 0 To .Parameters.Count - 1
      l_str結果 = l_str結果 & i & vbTab & .Parameters(i).Name & vbTab & .Parameters(i).Value & vbCrLf
    Next
  End With
  Call MsgBox(l_str結果, vbInformation, "結果出力")

End Sub

'パラメータ作成関数
Private Function パラメータ作成( _
         ByRef p_adoコマンド As ADODB.Command _
        , ByVal p_strパラメータ名 As String _
        , ByVal p_dtpDBタイプ As ADODB.DataTypeEnum _
        , ByVal p_intサイズ As Integer _
        , ByVal p_pdrパラメータ種別 As ADODB.ParameterDirectionEnum _
        , Optional ByVal p_obj初期値 _
    ) As ADODB.Parameter
    
  Dim l_adoPrm  As ADODB.Parameter

  Set l_adoPrm = p_adoコマンド.CreateParameter(p_strパラメータ名, p_dtpDBタイプ, p_pdrパラメータ種別, p_intサイズ)
  l_adoPrm.Value = IIf(IsMissing(p_obj初期値), vbNull, p_obj初期値)
  
  Set パラメータ作成 = l_adoPrm
End Function

#2のxcrOSgS2wYさんが飛ばしているリンク先の、.NETサンプルを書いた者です。

.NETからVB6へのコンバートをやってみました。
(いつもと逆方向への変換なので、違和感がありました^^;;;)

ストアドは、参考URLのまま利用しています。


Option Explicit

Sub Main()
  Const DEF_ストアド名 As String = "ストアド"
  
  Dim l_adoCnn  As ADODB.Connection
  Dim l_adoCmd  As ADODB.Command
  Dim l_adoRec  As ADODB.Recordset
  
  Set l_adoCnn = New ADODB.Connection...続きを読む

QVBからOracle接続が出来ません。

こんにちは。

VisualBasic6.0EnterprizeEdition から Oracle8i の接続を試みております。
接続が出来ません。コードは本のものをそのまま書いたので、間違いはないと思います。

Private Function OraOPN() As Boolean

Dim strDB As String * 30 'サービス名
Dim strUID As String * 30 'ユーザー名
Dim strPWD As String * 30 'パスワード
Dim strUP As String
Dim strMSG As String 'エラー時のメッセージ


On Error GoTo Ora_Error

strDB = Trim(txtLogon(2).Text)
strUID = Trim(txtLogon(0).Text)
strPWD = Trim(txtLogon(1).Text)
strUP = strUID & "/" & strPWD

strMSG = "データベースへの接続ができません"

Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.OpenDatabase(strDB, strUP, &H1&)

OraOPN = True

Exit Function

Ora_Error:

OraOPN = False
Call MsgBox(strMSG & vbCrLf & " システム管理者に連絡してください" & vbCrLf & vbCrLf & "", vbCritical)
End

End Function

以上のコードで、接続できません。本に書いてあるとおりそのままのコードです。オラクルサーバとVBプログラムは同一マシン上に置いてあります。

私は、Java専門でVBはわかりません。誰かわかる方がいたら、教えてください。よろしくお願いします。

こんにちは。

VisualBasic6.0EnterprizeEdition から Oracle8i の接続を試みております。
接続が出来ません。コードは本のものをそのまま書いたので、間違いはないと思います。

Private Function OraOPN() As Boolean

Dim strDB As String * 30 'サービス名
Dim strUID As String * 30 'ユーザー名
Dim strPWD As String * 30 'パスワード
Dim strUP As String
Dim strMSG As String 'エラー時のメッセージ


On Error GoTo Ora_Erro...続きを読む

Aベストアンサー

言葉が足りてないようなので、再度説明します。

>Net8 Easy Configを使わなくても良いと書いてありました。
「全く使用しないでもよい」と言うわけでもないのですが、、、

普通なら使用します。
>オラクルサーバとVBプログラムは同一マシン上
>会社のパソコンはSQL*PLUS を起動する際に、パスワードとユーザーは入力しますが、ホスト文字列は空白のままなので
とあるので、Net8 Easy Configを使用してDBを指定するような、設定はいらないと言うことです。


ですので
>Set OraDatabase = OraSession.OpenDatabase(strDB, strUP, &H1&)
の部分を
Set OraDatabase = OraSession.OpenDatabase("", strUP, &H1&)
とすることで、Net8 Easy Configを使用しないで接続できると思ったのです。


次の変数を使用しない値を直で与えて実行してもだめでしょうか?
Set OraDatabase = OraSession.OpenDatabase("", "SQLPLUSで使用しているID/SQLPLUSで使用しているPASS", &H1&)


ちなみ現在会社の環境はSQL鯖なので、日中は実験済みのお答えは即座にはお答えできません。

言葉が足りてないようなので、再度説明します。

>Net8 Easy Configを使わなくても良いと書いてありました。
「全く使用しないでもよい」と言うわけでもないのですが、、、

普通なら使用します。
>オラクルサーバとVBプログラムは同一マシン上
>会社のパソコンはSQL*PLUS を起動する際に、パスワードとユーザーは入力しますが、ホスト文字列は空白のままなので
とあるので、Net8 Easy Configを使用してDBを指定するような、設定はいらないと言うことです。


ですので
>Set OraDatabase = OraSession...続きを読む

QVB6(SP5)+OO4OでCreateObjectが失敗する

上記の環境でプログラムを作成しています。
Windows2000ではうまくいきました。
WindowsXP(Professional)で失敗します。

Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.OpenDatabase(C_ORACLE_TNS, C_ORACLE_USER & "/" & C_ORACLE_PASS, 0)

のようなコーディングでCreateObjectのところで失敗しエラーとして429 ActiveX コンポーネントはオブジェクトを作成できません。
というのが発生します。

Oracleのバージョンは9iでそのクライアントパック9.2.0.1.0を管理者モードでインストールしています。
もちろんOO4Oはインストールされていますし、VBの参照設定でOracle InProc Server 4.0 Type Libraly を追加しています。

何度か再インストールなどしましたが全く同じです。何がいけないのでしょうか?直接回答でなくてもヒントでも何でも教えてください。

なおSQL Plusでテーブルの参照はできています。

上記の環境でプログラムを作成しています。
Windows2000ではうまくいきました。
WindowsXP(Professional)で失敗します。

Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.OpenDatabase(C_ORACLE_TNS, C_ORACLE_USER & "/" & C_ORACLE_PASS, 0)

のようなコーディングでCreateObjectのところで失敗しエラーとして429 ActiveX コンポーネントはオブジェクトを作成できません。
というのが発生します。

Oracleのバージョンは9iでそのクライアントパッ...続きを読む

Aベストアンサー

通常は正しく削除されてしかるべきなのでしょうが、レジストリにキーが残った状態になることもありますので
・・・
完全削除についてはリリースノートにも記載されております。

Oracle9i Client for Windows インストレーション・ガイド リリース2 (9.2.0.1.0)(2002/8/7)
「オラクルコンポーネントのインストール」「oracleコンポーネントとサービスの削除」

参考URL:http://otn.oracle.co.jp/document/products/oracle9i/920/windows.html

Q実行時エラー429

あるプログラムを起動させようとすると
以下のメッセージが出てきてしまい起動できません。

実行時エラー429
ActiveXコンポーネントは、オブジェクトを作成できません。

対応策は、ございますか?
VB6の最新版は、ダウンロード済みです。
http://www.vector.co.jp/soft/win95/util/se188840.html

Windows98
Office97

諸事情でこちらの環境を替える事は、
出来ないんです・・・

Aベストアンサー

こんばんは。

よくわからないのですが、dao360.dllが入っていないから出るメッセージならば
下記参考URLからダウンロードしてみてはいかがでしょうか。

参考URL:http://www.vector.co.jp/soft/win95/util/se257084.html?site=n

QStatement ignored というエラー

Oracle 9iを使ってsqlファイルを実行させたところ、タイトルにあるように、
PL/SQL: SQL Statement ignored
というエラーメッセージが出力されました。
いろいろ検索してみると、これは、私にシステム権限がないことからおこるとあったのですが、
その設定変更の仕方がいまいちよくわかりませんでした。設定変更のしかたを教えていただけないでしょうか。
また、設定変更したことによって変わるのは私自身のシステム権限だけであって、他にコンピュータ(UNIX)を共有している人たちには影響はありませんよね?
立て続けに質問ばかりすみませんが、よろしくおねがいします。

Aベストアンサー

PL/SQLで権限がないということは、EXECUTE PROCEDUREシステム権限がないということでしょうか・・・。
前後のエラーも記載していただいた方が良いとは思いますが。

システム権限の付与方法は下記で行うことが可能です。
※ここでいう"ユーザ"はOracleユーザのことでスキーマとイコールです。
1.SYSTEMまたはSYS(DBA権限を持ったユーザ)でログイン
2.grant execute procedure to [対象ユーザ];
  または
  grant resource to [対象ユーザ];

以上で一応権限付与はできますが、どのような処理を行いたいかによって、これだけで解決するかどうかわかりません。
また、他の人への影響ですが、ユーザをどのように使用しているか、どのようなポリシーのシステムかによって異なります。(「私自身」というのが、セッションのことかスキーマのことかわかりませんでした。)
同じユーザを他の人と共通で使っていれば、もちろん他の人へ影響が出ますし、一人1ユーザ(スキーマ)で割当てられていれば、影響なく使えます。
「影響が出る」という意味は、セキュリティレベルが権限付与された分落ちるということで、機能的に使用できなくなることはありません。

なお、セッション単位で権限を割当てる方法はないと思っています。
付与した権限をセッション終了次第revokeすれば、元に戻るのではないでしょうか。

PL/SQLで権限がないということは、EXECUTE PROCEDUREシステム権限がないということでしょうか・・・。
前後のエラーも記載していただいた方が良いとは思いますが。

システム権限の付与方法は下記で行うことが可能です。
※ここでいう"ユーザ"はOracleユーザのことでスキーマとイコールです。
1.SYSTEMまたはSYS(DBA権限を持ったユーザ)でログイン
2.grant execute procedure to [対象ユーザ];
  または
  grant resource to [対象ユーザ];

以上で一応権限付与はできますが、どのような処理を...続きを読む

QTextBoxに半角数字のみの入力しかできないようにしたい

タイトルどおりです。
フォームに貼り付けた、TextBoxに、半角数字のみしか入力できないようにしたいです。
000000~999999までのコード(数字)を入力させるようにするわけですが、そのままだと半角英数も全角も入力できてしまいます。

GrapeCity社製のカスタムコントロール「InputMan」の“Number”を用いると簡単なのですが、これだとカーソルがボックス内の右端にきて、一の位から入力が始まってしまいます。
数字は、ボックス内の左側から入力されていくようにしたいのですが、“Number”だとなんか出来なさそう・・・?
(“Number”で左側から入力できるならそれがいいのですが)

そこで、TextBoxを使うことにしたのですが、TextBoxだと、半角数字のみしか入力できないような制限がかけるのかが、わかりません。

もし、お分かりの方がいらっしゃいましたら、ご教授下さいませ。

Aベストアンサー

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ' Ctrl + V
Case &H18 ' Ctrl + X
Case &H1A ' Ctrl + Z
Case Else
KeyAscii = 0
End Select
End Sub

で、いかがでしょうか。

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ...続きを読む


人気Q&Aランキング

おすすめ情報