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

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

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

Re[4]: VB6で実行時エラー:3265について


(過去ログ 83 を表示中)

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

■49296 / inTopicNo.1)  VB6で実行時エラー:3265について
  
□投稿者/ いっけい (1回)-(2010/04/29(Thu) 10:04:49)

分類:[VB6 以前] 

みなさんこんにちは。

OS:Windows Server 2008
SQLServer2008

Visual Basic 6.0

にて、アプリケーションを運用していると、時々
『実行時エラー 3265:要求された名前、または序数に対応する項目がコレクションに見つかりません』
と、時々表示されます。もう一度最初からプログラムを実行しなおすと、上記のエラーは発生しません。

VB6のソースを開発環境にて、プログラムを実行し、上記のエラーが発生するのを確認したのですが
下記のようなプログラム記述箇所で、エラーが出ています。指定したレコードセットのフィールド名は
合っているようなのですが。。。。


ソース例) 変数A = レコードセットA!フィールドA

     と記述したとき、フィールドAに値が代入されていません。
     イミディエイトウインドゥで
      『?レコードセットA.Fields("フィールドA")』と入力すると値は代入されているようです。

同じソースをWindowsServer 2008、SQLServer2005 ではエラーが発生しないようなのですが、何か設定でも
あるのでしょうか?

引用返信 編集キー/
■49313 / inTopicNo.2)  Re[1]: VB6で実行時エラー:3265について
□投稿者/ 魔界の仮面弁士 (1639回)-(2010/04/29(Thu) 23:22:42)
No49296 (いっけい さん) に返信
> 『実行時エラー 3265:要求された名前、または序数に対応する項目がコレクションに見つかりません』
> と、時々表示されます。もう一度最初からプログラムを実行しなおすと、上記のエラーは発生しません。

プログラムコード自体のバグの可能性は無いのですね?
# SQL がグローバル変数になっているなどして、実は別の場所で改変されていたとか、
# 変数を取り違えていたとか、階層化 Recordset で別のシェイプを参照していたとか。

コード自体に問題が無いのだとしたら、実際の SQL がどのような内容で、それを具体的にどのようなコードで
アクセスしているかを教えてください。SQL 2008 ではまだ聞いたことが無いのですが、古いバージョンでは
「長音記号(ー)」を使った列名や、全角カナ/半角カナなどの違いによる問題が起きたケースを聞いた事があります。
(私自身は、実際に現象を見たことが無いのですが、その時は列に AS COL1 などの別名をつけて回避したのだとか)


> ソース例) 変数A = レコードセットA!フィールドA
> 『?レコードセットA.Fields("フィールドA")』と入力すると値は代入されているようです。
!ではなく ! ですよね。

! を使ったアクセス方法は、全角/半角/大文字/小文字が予期せず改変されてしまう危険性があるため、
Rs!Col1.Value や Rs![Col1].Value といった表記方法では無く、
Rs.Fields("Col1").Value や Rs.Collect("Col1") といった表記法をお奨めしておきます。
(16bit版のVBでは ! を使ったコーディングが推奨されていましたが、現在では推奨されていません)

もし、! を使ってみた場合にも現象を回避できない場合には、単純な英数字の別名を用意してみてください。

また、別名を付けても回避できない(または、SQLを変更できない事情がある)場合には、
列名の代わりに序数でアクセスすることも検討してみてください。すなわち、
Rs!Col1.Value や Rs.Fields("Col1").Value や Rs("Col1").Value の代わりに、
Rs.Collect(0) や Rs.Fields(0).Value などでアクセスするという事です。
引用返信 編集キー/
■49341 / inTopicNo.3)  Re[2]: VB6で実行時エラー:3265について
□投稿者/ いっけい (2回)-(2010/04/30(Fri) 21:59:56)
魔界の仮面弁士 さん レスありがとうございます。

プログラム上、SQL文格納変数はローカル変数になっています。
!は、半角の『!』で記述してあります。

デバッグ環境で、変数の値をクイック表示してみると実際値が表示されます。

プログラム自体は、SQL2000のころから使っているソースをそのまま、使用しているのですが
何か、SQL2008の設定なのかなぁ?


引用返信 編集キー/
■49345 / inTopicNo.4)  Re[3]: VB6で実行時エラー:3265について
□投稿者/ はつね (1258回)-(2010/04/30(Fri) 22:26:46)
2010/04/30(Fri) 22:51:33 編集(投稿者)

No49341 (いっけい さん) に返信
> プログラム上、SQL文格納変数はローカル変数になっています。
> !は、半角の『!』で記述してあります。

!なのはAccessのVBAライクな書き方だったけれど、VBでは

レコードセットA.Fields("フィールドA")

という形式が正式な形式じゃなかったでしたっけ?

#ドキュメントを当たらずに書いているので違っていたらすいません。
引用返信 編集キー/
■49349 / inTopicNo.5)  Re[4]: VB6で実行時エラー:3265について
□投稿者/ 魔界の仮面弁士 (1641回)-(2010/05/01(Sat) 00:03:03)
No49341 (いっけい さん) に返信
> デバッグ環境で、変数の値をクイック表示してみると実際値が表示されます。
提示された情報だけでは、一般論でしか答えられそうにありません。(検証のしようが無いので…)

先の投稿にて
>> コード自体に問題が無いのだとしたら、実際の SQL がどのような内容で、
>> それを具体的にどのようなコードでアクセスしているかを教えてください。
と書きましたが、現象を再現可能な最低限のコードを提示することはできないでしょうか。


No49345 (はつね さん) に返信
> !なのはAccessのVBAライクな書き方だったけれど、

! は、コレクションメンバに対するショートカット記法だったかと。(Access VBA でも VB4 でも VB.NET でも)
この表記法では、文字列引数を伴うインデクサが指定されたかのように振る舞います。

「Rs!フィールド名」という表記であれば、Fields プロパティから返されるコレクションに対して、
「Rs.Fields.Item("フィールド名")」が指定されたものとして処理されます。

ちなみに、空白を含むフィールド名の場合には、Rs![Field Name] のように角括弧で囲みます。


同様に、VB6 の Form 上の Label1 コントロールを操作する場合において、
 Me!Label1.Left = 0
 Me.Controls!Label1.Left = 0
 Me.Controls("Label1").Left = 0
 Me.Controls.Item("Label1").Left = 0
は、いずれも同じ結果となります(若干の処理速度の違いはありますが)。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -