関数内でのSQL文実行→エラー検知されない…

このQ&Aのポイント
  • 関数内でのSQL文実行において、エラーが検知されない現象が発生しています。エラーページに適切に飛ぶための処理が行われているにもかかわらず、SQL文にエラーが含まれている場合でもエラーページに遷移しません。
  • 現在、ASPで開発を進めているsasakidです。SQL文を実行する関数内でエラーがあった場合にエラーページに遷移する処理を実装していますが、エラーが検知されない問題が発生しています。
  • この問題の原因を特定するために、関数exeSql1内の処理を確認しました。関数内で実行されるSQL文にエラーを含めても適切にエラーページに遷移しないことがわかりました。原因が分かる方がいらっしゃいましたら、教えていただきたいです。
回答を見る
  • ベストアンサー

関数内でのSQL文実行→エラー検知されない・・・。

いつもお世話になってます。 sasakidと申します。 現在、ASPで開発を進めています。 エラーが発生したらエラーページに飛ぶように適所に 以下の文を入れています。 '------エラー処理-------- If Err.Number <> 0 Then  Call goto_ErrPage() ←…エラーページに飛ぶ関数 End If ほとんどの個所でエラーページに飛ぶことを確認しました。 今、困っていることはSQL文を実行する関数内で SQL文にエラーがあったとしてもどうやらエラーが検知されていないようなのです。 '=====SQL文実行関数=========== Function exeSql1(sql) exeSql1 = -1 'エラーセット sql = sql & "ORDER BY test" '←…エラーが出るように追加    Set rs = db.Execute(sql) If Err.Number <> 0 Then Set rs = Nothing Exit Function End If (中略) exeSql1 = 0 End Function '======本文================== (中略)   tmp = exeSql1(sql) If tmp <> 0 Then '戻り値がエラー(0以外)だったらエラー画面へ Call goto_ErrPage() ←…エラーページに飛ぶ関数 End If (後略) ------------------------- どんなに関数:exeSql1で実行されるSQL文にエラーを含めてもエラーページに飛びません。 本文中で実行しているSQL文にエラーが含んでいるとエラーページに飛ぶのですが・・・。 こんな現象の原因などわかる方がいらっしゃいましたら教えてください!!! よろしくお願いします。     

質問者が選んだベストアンサー

  • ベストアンサー
  • run_away
  • ベストアンサー率42% (8/19)
回答No.1

URL参照

参考URL:
http://www.microsoft.com/japan/developer/library/modcore/decontheadoerrorobjecterrorscollection.htm
sasakid
質問者

お礼

run_awayさん、 回答ありがとうございました。 お礼が遅くなってすみませんでした。 参考URLをみまして↓のように対処しました。 ・エラーページに飛ぶ処理を入れている関数の始めにも  On Error Resume me  を加える。 テストにてエラーページに遷移することを確認しました。 どうもありがとうございました。

関連するQ&A

  • Excel:SQL実行関数のエラー原因を知るには?

     年甲斐もなく昨日からSQLでExcelデータを参照、更新、削除する二つの関数の作成に挑戦しています。が、 >[Microsoft][ODBC Excel Driver] パラメーターが少なすぎます。 >1を指定してください。 とのエラーで立ち往生中。  作成しているのは、SELECT文を実行するDBLookup()とUPDATE文、INSERT文、DELETE文を実行するCnnExecute()の二つ。どちらも、添付図のようにTESTに成功。で、一旦、Excel を閉じて、もう再テスト。すると、前述のエラーに遭遇。一度だけDBLookup()が正常に動いたのでCnnExecute()も再テスト。すると、前述のエラーが発生。同時に、DBLookup()も動かなくなりました。で、その後、5時間の試行錯誤中。だが、手詰まり感強く質問することに。このようなバグ取りで他者に質問と言う形で助けを求めるのは実に情けないことです。そこは、大目に見て下さい。 【質問】どういうアプローチをすべきと思いますか? 【DBLookup()のコード】 Public Function DBLookup(ByVal strQuerySQL As String, _              Optional xlFileName As String = "", _              Optional returnValue As String = "") As Variant On Error GoTo Err_DBLookup   '   ' 【要参照設定】   '   ' Micrsoft ActiveX Data Objects 2.8 Library   '   Dim DataValue   Dim cnn As ADODB.Connection   Dim rst As ADODB.Recordset   Set cnn = New ADODB.Connection   Set rst = New ADODB.Recordset   '   ' ThisWorkbook.FullName の指定   '   If Not Len(xlFileName) Then      xlFileName = ThisWorkbook.FullName   End If   '   ' 接続設定   '   With cnn     .Provider = "MSDASQL"     '     ' 32bit     '     'cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _     '           "DBQ=" & xlFileName & ";" & _     '           "ReadOnly=False;"     '     ' 64bit     '     .ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _               "DBQ=" & xlFileName & "; ReadOnly=False;"     .Open     '     ' 列の読み込み     '     With rst       .Open strQuerySQL, cnn, adOpenStatic       If Not .BOF Then         .MoveFirst         DataValue = .Fields(0) & ""       End If     End With   End With Exit_DBLookup: On Error Resume Next   rst.Close   cnn.Close   Set rst = Nothing   Set cnn = Nothing   DBLookup = IIf(Len(DataValue), DataValue, returnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function 【CnnExecute()のコード】 Public Function CnnExecute(ByVal strSQL As String, _               Optional xlFileName As String = "") As Boolean On Error GoTo Err_CnnExecute   '   ' 【要参照設定】   '   ' Micrsoft ActiveX Data Objects 2.8 Library   '   Dim isOK As Boolean   Dim DataValue   Dim cnn As ADODB.Connection   isOK = True    Set cnn = New ADODB.Connection   '   ' ThisWorkbook.FullName の指定   '   If Not Len(xlFileName) Then      xlFileName = ThisWorkbook.FullName   End If   '   ' 接続設定   '   With cnn     .Provider = "MSDASQL"     '     ' 32bit     '     'cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _     '           "DBQ=" & xlFileName & ";" & _     '           "ReadOnly=False;"     '     ' 64bit     '     cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _               "DBQ=" & xlFileName & ";" & _               "ReadOnly=False;"     .Open     .Execute strSQL   End With Exit_CnnExecute: On Error Resume Next   cnn.Close   Set cnn = Nothing   CnnExecute = isOK   Exit Function Err_CnnExecute:   isOK = False   MsgBox "SQL 文の実行時にエラーが発生しました。(CnnExecute)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_CnnExecute End Function  「あっ、これは、多分、こういうことだな!」という思われた方は、気軽にご回答ください。

  • 実行時エラー92 forループが初期化されていませ

    エクセルVBAでFor Eachを使ってるのですが、 Nextの部分で 実行時エラー92 forループが初期化されていません。 というエラーになります。 On Error GoTo ERR1 For Each myObj In objIE.Document.all.tags("ul") If myObj.className = "" Then '○○の場合 Exit Sub ERR1: If Err.Number = 424 Then On Error GoTo 0 'エラーを解除 '▲▲の場合 If strカテゴリ Like "" Then Exit Sub End If End If End If Next というコードなのですが、どこかおかしいですか?

  • 更新時エラー番号5

    言語:VB5.0 DB:Access で既存プログラムを修正しています。 データの更新時、SQLを記述後に If RunSQL(SQL) <> R_OK Then '実行 Call ErrMsg(1) 'エラーメッセージ Exit Sub 'サブルーチン終了 End If としています。 RunSQLのなかでは、 Function RunSQL(SQL) As Integer On Error Resume Next Dim ErrorCnter As Integer 'エラーカウンター RunSQL = R_OK 'リターンコード(OK) For ErrorCnter = 1 To 5 'エラーカウンター5までループ DB.Execute SQL, dbFailOnError 'エグゼキュート実効 If Err <> 0 Then '失敗時 If ErrorCnter = 5 Then 'エラーカウンター5のとき RunSQL = Err 'リターンコード(エラー) End If Else '成功時 Exit For 'ループぬける End If Next End Function このようになっています。 ある更新をかけたとき、 このエラーにかかってしまいます。 SQLがおかしいのかな?とおもい、 AccessのクエリーにSQLをうつして 実行すると、実行できます。 。。。プロシージャが不正に使われている、 というエラーのようなんですが、 これはどういうことなんでしょうか? データでは,実行できるのに、コーディング上で 実行エラーになる、ということなのですが。。

  • エラー処理

    エラー処理について質問です。 私はどうもVBのエラー処理が頭についているせいか、Javaの例外処理等が面倒に見えてならないんです。 例えば下記はVBのエラー処理なんですが、引数を得て計算して値を返すというものなのですが、引数自体が間違えてたら意味ないということでチェックします。 色んなチェックをして1つでも間違えてたらVVV_ERRORに飛びます。 下記のように「桁数チェック」とか「数値か?」とか調べる場合、Javaだとどのようにして書いたらいいのでしょう? Javaならtry文に全部入れてしまえばいいのでしょうが… .....例 try { x = 10 / 5; y = 20 / 0; //エラー } catch ( ArithmeticException ex ) { System.out.println (" 0で割ることはできません"); .....略 要は下記VBのようにモジュールごとに独自のエラーコードが存在する場合、どうエラー処理を書いたらいいのかということです。 皆さんならどうしますか?よろしければご意見等お願い致します。 //////////////////////////////////////////////////////////////// public Function VVV(YYYYMMDD As String , Kotae As String) As String ...... vvv_err = "" On Error GoTo VVV_ERROR '***************引数チェック '8桁か? If Len(YYYYMMDD) <> 8 Then vvv_err = "8桁ではありません" GoTo VVV_ERROR End If '数値か? If IsNumeric(YYYYMMDD) = False Then vvv_err = "数値ではありません" GoTo VVV_ERROR End If .....略(同じようなIf文の引数チェックがたくさんあります) '***************ERROR処理 VVV_ERROR: vvv_err = vvv_err & err.Description & err.Number .....略

    • ベストアンサー
    • Java
  • ACCESSを活用して商品変動を捉えたい(5再再)

    http://okwave.jp/qa/q8782706.html 上記について標準モジュールも作成して、先のクエリーを実行しましたが、 その際に !コンパイル エラー: ユーザー定義型は定義されていません。 と出ます。 5行目の rst As ADODB.Recordset 箇所が反転されています。 一回でできるのは魅力なのですが、本当に実装できるのでしょうか。 (クエリーはたしかに保存できました) Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function

  • VBでAccessにSQL文を実行して値を取り出す

    下記のソースは、 UserIDとPasswordをDBと照らし合わせて、 そのUserが存在すればTrue、存在しなければFalse を返すというプログラムです。 しかし初めてDBに接続し、まったく右も左も分からない 状況なので処理的におかしな点を教えていただけないでしょうか。 またDB接続からSQL実行までの簡単な流れを教えていただけると助かります。 adoRs = ADODB.Recordset adoCn = ADODB.Connection adoCd = ADODB.Command Login.txtName.Text = 比較するユーザー名 Login.txtPass.Text = 比較するパスワード です。その他わかりにくい点があったら質問を お願いします。 Private Function Func_UserSerch() As Boolean Func_UserSerch = False On Error GoTo UserSerchError 'レコードセットの取得 With adoRs .ActiveConnection = adoCn .Source = "user" .CursorType = adOpenStatic .LockType = adOpenForwardOnly .Properties("IRowsetIdentity") = True .Open End With MySQL = "SELECT * FROM user " & _ "WHERE UserID = " & Login.txtName.Text & _ "AND Password = " & Login.txtPass.Text & ";" 'SQLの実行 With adoCd .ActiveConnection = adoCn .CommandType = adCmdStoreProc .CommandText = MySQL .Execute End With If adoRs.EOF = True And adoRs.BOF = True Then Func_UserSerch = False Else Func_UserSerch = True End If UserSerchError: MsgBox "SQL実行中にエラーが発生しました" End Function

  • Excel:自作のセル関数でエラーが発生

    Win2K、Excel97-2000-2002を使用しております。 以下のような関数を作成しました。 Public Function sss() As Boolean  On Error GoTo aaa   Range("A1").Value = "TEST"  sss = True Exit Function aaa:  MsgBox Err.Description  sss = False End Function これをSheet1のB1セルで呼びましたところ、 Rangeへのセットのところで以下のようなエラーが発生します。 「アプリケーション定義またはオブジェクト定義のエラーです。」 同関数をイミディエイトウインドウで実行しましたところ、正常に動きます。 セルの内容を変更するようなメソッドをセル関数として呼ぶことはしてはいけないのでしょうか。 御教授、御鞭撻の程、よろしくお願いいたします。

  • VBScriptでのDBのエラー取得

    VBScriptでADO(ADODB)接続により、SQLServer(2012)に接続して クエリを発行し、結果をファイルに出力するVBScriptを作成して います。 SQL実行時のエラーに対応する為、VBScriptにてエラーオブジェクトのプロパティ (Err.Number、Err.Description)を使用し、エラー番号と内容を取得しているの ですが、SQL Serverから発行しているエラー番号、エラー内容を取得したいので すが、取得できません。 どのようにすれば、データベース固有のエラーを取得ができますか。 是非ご教示いただきたく、 お手数をおかけ致しますが、宜しくお願い致します。 ------------------------------------------------- Option Explicit Dim objADO Dim objRS Dim Sql if WScript.Arguments.Count <> 1 then WScript.echo("usage: script.vbs arg1") WScript.Quit(-1) end if arg1 = WScript.Arguments(0) Set objADO = CreateObject("ADODB.Connection") objADO.Open "Provider=SQLOLEDB;" & _ "Data Source=hoge;" & _ "Initial Catalog=hoge;" & _ "Integrated Security=SSPI;" sql = "" sql = "select ~ where column ='"&arg1&"'" set objRS = objADO.Execute(sql) If Err.Number <> 0 Then objADO.Close Set objADO = Nothing WScript.Quit(-1) End If sql = "" sql = "update ~ ~ where column ='"&arg1&"'" objADO.Execute(sql) If Err.Number <> 0 Then 更新の破棄とエラー内容の表示 Else 更新を反映 End If objADO.Close Set objADO = Nothing

  • 関数の中にif文を入れると「関数は値を返しません」

    どなたかよろしくお願いします。(windowsXP、FlashCS3pro) 関数の中にif文(switch文)を入れると「関数は値を返しません」というコンパイルエラーが出ます。 どこか間違ってますでしょうか。もしくはこれは仕様でしょうか。 エラーが出る ------------------------- xTest("1"); function xTest(req:String):String { if (req == "1") { return req; } } //実行結果:エラー1170「関数は値を返しません」 ------------------------- ちなみにこれだとエラーはでません。 ------------------------- xTest("1"); function xTest(req:String):String { return req; } //実行結果:1 ------------------------- また、関数内にif文を入れても、関数の型指定をしなければエラーは出ません。 ------------------------- xTest("1"); function xTest(req:String) { return req; } //実行結果:1 ------------------------- よろしくお願いします。

    • ベストアンサー
    • Flash
  • SQLについて教えてください。

    お世話になります。 ORACLE SQLについて質問させて下さい。 ACCESS2003より以下のようなSQLを発行しています。 SELECT A.商品CD, A.区分, SUM(A.数量) AS 受数量, SUM(A.金額) AS 受金額 FROM テーブル1 A INNER JOIN テーブル2 B ON SUBSTR(A.商品CD,1,13) = B.商品コード WHERE A.年 = 2008 AND A.月 = 03 AND B.区分 = '51' GROUP BY CUBE(A.商品CD, A.区分) ORDER BY A.商品CD, A.区分 集計のSQLです。 SQLは正しいと思うのですが、実行結果が返ってきません。0件です。 調べていたところ、SQLを発行した後のレコードカウントに 「実行時エラー '-2147467259' データプロバイダまたはほかのサービスがE_FAIL状態を返しました。」 とあり、件数が0件(SQL自体動いていない?)でした。 SQL自体は開発ツールとして使用している、「オブジェクトブラウザ」のSQL発行機能にて実際に動かしてデータも正しく抽出されることは確認してるいるのですが。。 他にネットで調査したところ、抽出件数が多すぎると上記のようなエラーが起こる?みたいな事も書いてありました。 しかし、結果の件数はそんなに多くはないのです。(200レコードくらい。) なぜ起こるか、どうすればいいか、が良く分かりません。。。 解決策、回避策がありましたら教えていただきたいと思います。 SQLを発行するサブルーチンも記載しておきます。 ↓↓↓ Public Function cmn_DoSelectSql(ByVal pstrSql As String, pstrData() As String) As Long Dim lngErrNum As Long 'エラー値 Dim strErrMsg As String 'エラーメッセージ Dim adoRs As ADODB.Recordset 'レコードセット Dim lngColCnt As Long '最大レコード数 Dim lngRowCnt As Long '最大フィールド数 Dim objField() As Object Dim lngCol As Long 'レコードカウントアップ用 Dim lngRow As Long 'フィールドカウントアップ用 On Error Resume Next cmn_DoSelectSql = 0 '変数初期化 g_lngOraRecCnt = 0 'パラメータチェック If pstrSql = "" Then Call cmn_ErrMsgDsp("-", "パラメータ異常が発生しました。") cmn_DoSelectSql = -9 Exit Function End If If (g_adoCon Is Nothing) Then Call cmn_ErrMsgDsp("-", "パラメータ異常が発生しました。") cmn_DoSelectSql = -9 Exit Function End If Set adoRs = New ADODB.Recordset adoRs.CursorLocation = adUseClient 'SQL実行 adoRs.Open pstrSql, g_adoCon, adOpenStatic, , adCmdText 'エラーセット lngErrNum = Err strErrMsg = Error(Err) 'エラーメッセージ表示 If (lngErrNum <> 0) Then Select Case lngErrNum '排他エラー Case 54: cmn_DoSelectSql = -2 'その他 Case Else Call cmn_ErrMsgDsp(lngErrNum, strErrMsg) cmn_DoSelectSql = -1 End Select GoTo sub_Exit End If '列数セット lngColCnt = adoRs.Fields.Count If adoRs.RecordCount > 0 Then ←ココに上記エラーメッセージが入ってきます。。。 g_lngOraRecCnt = adoRs.RecordCount lngRowCnt = adoRs.RecordCount '受渡用変数初期化 ReDim pstrData(1 To lngRowCnt, 1 To lngColCnt) Erase objField ReDim objField(0 To lngColCnt - 1) For lngCol = 0 To lngColCnt - 1 Set objField(lngCol) = adoRs.Fields(lngCol) Next lngCol '受渡用変数セット For lngRow = 0 To (lngRowCnt - 1) For lngCol = 0 To (lngColCnt - 1) pstrData(lngRow + 1, lngCol + 1) = Cmn_NullToSpace(objField(lngCol).Value) Next lngCol adoRs.MoveNext Next lngRow End If sub_Exit: If (Not adoRs Is Nothing) Then adoRs.Close Set adoRs = Nothing End If End Function 自分で開発したものではないのですが、コレといって間違いはないように思えます。。 もし何かありましたらアドバイス等お願い致します。 ・・・集計SQLは実行できないのでしょうか。。