2011-08-01 13 views
0

。スクリプトは主にテーブルを開いて、フラットデータベースのすべての行をチェックして重複していないことを確認し、必要なフィールドを追加します。テーブルごとに繰り返します。アクセスVBA、エスケープ単一引用符、交換してください()、およびヌル

私は名前O'Malleyを処理しようとするまで、すべてがうまくいったことを実行した初めて。何が間違っているのかは明らかです。 Googleのクイック検索がthis related StackOverflow postとなった。私は助言を受けて、新しいテーブルに入力する前にすべてのフィールドにReplace(str, "'", "''")を追加しました。今、私は新しい問題にぶつかり、Googleはそれほど役に立たない。

Replace(null, "'", "''")は、実行時エラーが発生し、フラットなデータベースは、NULL値を持つだけでだらけです。その代わりにReplace(str, "'", "''")のデータベースにnullを置く場合、私は、単一の行可能な場合に収まることができるソリューションを好むだろうが、私は、IsNull()をチェックするすべてのReplace()コールの上に余分な行を追加することができます。このジレンマを解決するためのさらにエレガントな方法はありますか、または自分のコードに216 Ifステートメントが必要ですか?

EDIT - 私はよりエレガントな解決策を探しています

もう一つの理由は、私の重複チェックコードです。 Replace()呼び出しは、私が代わりにnullをチェックするIfステートメントを使用していたならば、私は結果を保存するかだろう、重複チェックとインラインであるため、

 'Check for duplicates 
     'Assume student is duplicate if it shares: 
     ' (StudentName and School) or SSN 
     Set rstDuplicate = CurrentDb.OpenRecordset("select * from Student where (StudentName = '" & Replace(rstFrom("Student").Value, "'", "''") & "' AND School = '" & Replace(rstFrom("School").Value, "'", "''") & "') OR SSN = '" & Replace(rstFrom("Social").Value, "'", "''") & "'") 
     If rstDuplicate.RecordCount = 0 Then 
      'Duplicate was not found 
      rstTo.AddNew 
      ' Add fields to the new table 
      rstTo.Update 
     End If 

:現時点では私は次のようなものを持っていますフラットデータベースへの文字列または更新。余分な変数を必要とせずにReplace(str, "'", "''")またはnullを返す関数が理想的です。しかし、読んで維持するために悪夢になります

IIf(IsNull(rstFrom("Student").Value), " Is Null", "= " & Replace(rstFrom("Student").Value) 

+0

216回何かを変更する必要がある場合は、間違っています。チェックを関数にリファクタリングすることについて考えましたか? – Jacob

+0

また、[パラメータ化されたクエリ](http://stackoverflow.com/questions/95277/how-do-you-create-a-parameterized-query-in-ms-access-2003-and-use-other-queries)を使用してください。 -f)を使用してデータをエスケープします。 – Jacob

+1

あなたの最初の段落を読むことから、データを20個の同じ構造のテーブルに分割しているように思えますが、これはほぼ間違いです。あなたがAccessの2GBのファイルサイズの制限にぶつかっているかどうかが賢明な唯一の理由です。もちろん、そのシナリオでは、おそらく別のdbバックエンドを考慮する必要があります。 – mwolfe02

答えて

1

インラインすべてを維持したい場合は、あなたが(IIf)関数であれば即時に使用することができます。

Function CompFld(Val As Variant) As String 
    If IsNull(Val) Then 
     CompFld = " Is Null " 
    Else 
     CompFld = "= '" & Replace(Val, "'", "''") & "' " 
    End If 
End Function 

はようにそれを使用してください:あなたは、比較演算子の変化だけでなく、アポストロフィのエスケープを処理するために、独自の機能を書いたほうが良いです

Dim SQL As String 
SQL = "SELECT * FROM Student " & _ 
     "WHERE (StudentName " & CompFld(rstFrom("Student").Value) & " AND " & _ 
     "  School " & CompFld(rstFrom("School").Value) & ") " & _ 
     " OR (SSN " & CompFld(rstFrom("Social").Value) & ") " 
Set rstDuplicate = CurrentDb.OpenRecordset(SQL) 
If rstDuplicate.RecordCount = 0 Then 
    'Duplicate was not found 
    rstTo.AddNew 
    ' Add fields to the new table 
    rstTo.Update 
End If 
1

受け継が簡潔な、まだ醜い小さな宝石私には前の年齢から:

Replace(str & "", "'", "''") 

NULL値に空の文字列を追加はVBAで空の文字列を返し、非空の文字列を変更しません。

+0

'str'という名前の変数は文字列型でなければならないので、最初はNullにすることはできません。第2に、VBAコードでは、組み込みの 'vbNullString'定数を使用するために長さゼロの文字列を連結しようとすると、そのメモリが既に割り当てられているので、より効率的です。単一行で問題はありませんが、ループで呼び出す場合は、パフォーマンスに大きな違いがあります。基本的には、VBAコードで '' ''を使わないでください。代わりに常に 'vbNullString'を使います。 –

+0

'str'がデータベースから動的に引き出される場合、文字列であるという保証はありません。 'null'という値を持つ' text'型のフィールドを持つことができます。 'CurrentDb.TableDefs(" table ")のような行。フィールド(" field ")。Value'はnullを返します。これは私の問題でした。 – stevendesu

+0

変数に "str"という名前を付けると、文字列型で、Access VBAであり、Nullにはできません。私はあなたの変数名があなたがここで達成しようとしているものについて誤解を招くと言っています。もちろん、SQLステートメントのフィールドを表す "str"を意味する場合は、使用するのがさらに悪い名前だと思います。良い慣習があることはわかりませんが、 'Replace([Field]& '' '、' ''、 '' '") 'は意図していることを明確にします。 –

1

アクセス 'データベースエンジンは、クエリの文字列値の区切り文字として一重引用符または二重引用符を受け入れます。だからではなく、

SELECT * FROM Student WHERE StudentName = 'O''Malley' 

...の...あなたは...あなたはアポストロフィが含まれている入力を処理できるようになる

SELECT * FROM Student WHERE StudentName = "O'Malley" 

これを行うことができます。 OTOHでは、文字列入力にも二重引用符が含まれていると、これは中断されます。

私はアポストロフィの問題だけでなく、あなたの大きな写真を理解できないと思っています。 rstFromの各レコードの3番目のDAOレコードセットを開いて、Studentテーブルに一致するレコードがあるかどうかを確認しているようです。代わりにDCount()を使用します。

Dim strCriteria As String 
strCriteria = "StudentName = ""O'Malley"" AND School = ""foo""" 
If DCount("*", "Student", strCriteria) = 0 Then 
    'no match found --> add it ' 
End If 
関連する問題