。スクリプトは主にテーブルを開いて、フラットデータベースのすべての行をチェックして重複していないことを確認し、必要なフィールドを追加します。テーブルごとに繰り返します。アクセス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)
:
216回何かを変更する必要がある場合は、間違っています。チェックを関数にリファクタリングすることについて考えましたか? – Jacob
また、[パラメータ化されたクエリ](http://stackoverflow.com/questions/95277/how-do-you-create-a-parameterized-query-in-ms-access-2003-and-use-other-queries)を使用してください。 -f)を使用してデータをエスケープします。 – Jacob
あなたの最初の段落を読むことから、データを20個の同じ構造のテーブルに分割しているように思えますが、これはほぼ間違いです。あなたがAccessの2GBのファイルサイズの制限にぶつかっているかどうかが賢明な唯一の理由です。もちろん、そのシナリオでは、おそらく別のdbバックエンドを考慮する必要があります。 – mwolfe02