0

私はこのコードを使用していて、型の不一致のエラーが発生しています。実行時エラー '13' エラーは以下にマークされている行にあります。具体的にはprereq.paid=" + rs1!paid + " "、クエリの where 条件 ( ) が原因でエラーが発生しています...

rs1.Open "select name,nposts,postad.paid as paid from ad,post,postad where ad.adid = " +
         cmbAdno.Text +
         " and ad.adid=postad.adid and postad.pid=post.pid ", con, adOpenDynamic, 
         adLockOptimistic

While Not rs1.EOF
  cmbTitle.AddItem (rs1!Name)    
  rs1.MoveNext
Wend

rs1.MoveFirst

cmbTitle.Text = rs1!Name
txtNposts.Text = rs1!nposts

If IsNumeric(rs1!paid) Then
  MsgBox (rs1!paid + 1)
End If

**rs2.Open "select title from postad,prereq where postad.paid = prereq.paid and prereq.paid=" + 
        rs1!paid + " ", con, adOpenDynamic, adLockOptimistic**

While Not rs2.EOF
  lstPrereq.AddItem (rs2!Title)
  rs2.MoveNext
Wend

rs2.Close

rs1.Close
4

2 に答える 2

5

ふぅ、そのコードにはいくつかの作業が必要です!

ただし、ここではプラス演算子が原因です。小さなテストケースでこれを簡単に確認できます。

Dim ADO_Field_Value As Variant
Dim S As String

ADO_Field_Value = True

On Error Resume Next
S = "text" + ADO_Field_Value + ""
If Err Then MsgBox "Plus failed, err " & CStr(Err)
Err.Clear
S = "text" & ADO_Field_Value & ""
If Err Then MsgBox "Amp failed, err " & CStr(Err)

これを実行すると、「+」はエラー13を生成しますが、「&」は期待どおりに機能します。

連結にはアンパサンドを使用します。プラスのみの並べ替え、ちょっと古代との下位互換性のために機能します。これを使用するには、コンパイラが演算子のソフトオーバーロードを解決するために意図を推測する必要があります。

空の文字列を.Valueに連結する「ヌルハック」は特に賢いものではありません。rs1にNullがある場合、エラー94が発生する「+」を使用しない限り、SQL構文エラーが発生します。

ADOフィールド値は、コンパイラにフィールドのデフォルトプロパティが必要であると推測させる代わりに、明示的に.Valueを使用することで、より安全にアクセスできます。While / Wendは廃止されましたが、これらの無関係な括弧はどうなっていますか?

あなたはコンパイラに、おそらくこのコードではしてはいけないことをするように求めています。

于 2012-06-03T12:55:16.393 に答える
0

データベースで rs1!paid はブール値ですか? その場合、クエリ文字列を作成するための連結に問題がある可能性があります。昔、VB6を使っていたときは、そのようなフィールドにアクセスしたことはありませんでした。rstRecordSet.Fields(0) または rstRecordSet.Fields("field1") のようなものを使用しましたが、フィールドが存在する場合は問題になりません。前に文字列を作成し、クエリの連結を渡し、それが満たされることを確認します。

また、「...postad.paid aspaid...」とありますが、なぜですか? そこのフィールドの名前を変更する必要はありません...

于 2012-06-03T12:21:22.270 に答える