ExcelVBAを介してデータベースで使用されるSQLステートメントの引用符で囲まれた文字列をエスケープする方法

今すぐ共有:

SQL Server 一重引用符のペアを使用して、tartと文字列の終わり。 「MrsBrown'sBoys」をデータベーステーブルに挿入すると、XNUMXつの一重引用符がXNUMXつの文字列を意味し、そのうちのXNUMXつが不完全であるため、失敗します。 apにはエスケープ文字が必要ですostブラウンの後のローフ。 この記事では、カスタマイズされたVBA関数を使用してこの異常を解決する方法について説明します。

この記事は、読者が開発者リボンを表示していて、VBAエディターに精通していることを前提としています。 そうでない場合は、Googleの「Excel開発者タブ」または「Excelコードウィンドウ」をご覧ください。

ここでの「データベース」という用語は、次のような「産業用強度」データベースに適用されます。 SQL Server and Oracle.

この演習で使用したワークブックの例を見つけることができます こちら.

SQL文字列

apの包含ostSQLステートメント内のrophes(または一重引用符)は、データベースマネージャーから返される次のエラーを提供します(この場合はO'Dowdという名前の場合)。データベースマネージャから返されたエラー

ダブルapであるエスケープ文字が必要ですost単一のものの代わりにrophe。 したがって、O” Dowdはデータベースに受け入れられます。 O'Dowdはそうではありません。

関数

キャプチャフィールドにapが含まれている可能性がある場所ostropheは、更新前に起動するカスタム関数を作成して、一重引用符を二重引用符に置き換えることができます。

  1. 新しいブックを開きます。
  1. 最初のシートに「更新」という名前を付け、独自のデータベース名などを使用して、次のように入力します。これらのフィールドは、接続文字列を作成するために使用されます。 SQL Server.最初のシートに「更新」という名前を付け、このように完成させます
  2. コードウィンドウを開き、モジュールを挿入します。 メニュー項目> [ツール]> [参照]を使用して、ADOlibを参照しますraries。コードウィンドウを開き、モジュールを挿入します

以下のコードをモジュールにコピーします。 これはデータベースに接続します。

Public connDB As New ADODB.Connection Public rs As New ADODB.Recordset Public strSQL As String Public strCriteria As String Sub ConnectDatabase()If connDB.State = 1 Then connDB.Close On Error GoTo ErrConnect Dim strServer、strDBase、strUser、strPWD As String strServer = Sheets( "Update")。Range( "B2")strDBase = Sheets( "Update")。Range( "B3")strUser = Sheets( "Update")。Range( "B4")strPWD = Sheets( " Update ")。Range(" B5 ")If strPWD>" "Then strConnectionstring =" DRIVER = {SQL Server}; Server = "&strServer&"; Database = "&strDBase&"; Uid = "&strUser&"; Pwd = "&strPWD&"; Connection Timeout = 30; "Else strConnectionstring =" DRIVER = {SQL Server}; SERVER = "&strServer&"; Trusted_Connection = yes; DATABASE = "&strDBase'Windows認証EndIf connDB.ConnectionTimeout = 30 connDB.Open strConnectionstring Exit Sub ErrConnect:MsgBox Err.Description End Sub
  1. モジュールに関数を追加します。
関数fRemoveApostrophe(strWord As String)Dim n As Integer Dim x As Integer x = 0 For n = 0 To 100 x = InStr(x + 2、strWord、 "'")' apの位置を検索ostrophes If x = 0 Then Exit For If x> 0 Then strWord = Left(strWord、x --1)&Chr(39)&Chr(39)&Right(strWord、Len(strWord)-(x))End If Next n fRemoveApostrophe = strWord終了関数
  1. 関数を無視します。
Sub IgnoreFunction()Call ConnectDatabase strCriteria = Sheets( "Update")。Range( "B10")strSQL = "Insert into tblCrewMember(LastName)values( '"&strCriteria& "')" MsgBox strSQL& "。このSQLエントリは失敗; XNUMXつのapに注意してくださいostrophes。 "Debug.Print strSQL'connDB.Execute(strSQL)End Sub
  1. 関数を使用する
Sub UseFunction()ConnectDatabaseを呼び出しますstrCriteria = Sheets( "Update")。Range( "B15")strCriteria = fRemoveApostrophe(strCriteria)strSQL = "tblCrewMember(LastName)値に挿入( '"&strCriteria& "')" MsgBox strSQL& "。このSQLエントリは成功し、データテーブルにO'Dowdとして表示されます。" Debug.Print strSQL'connDB.Execute(strSQL)End Sub
  1. こちらのページにある「異議申立てフォーム」に必要事項を全てご記入ください: 更新 次のようなワークシート、starセルでティン A8:更新ワークシートに記入する
  1. ボタンをマクロに割り当てる 無視関数 and 使用関数 それぞれに

結果

メッセージボックスに結果が表示されます。 この演習ではデータベースは物理的に更新されませんが、更新する場合は、フィールド名がデータベースと互換性があることを確認し、VBAステートメントconndb.execute(strSQL)を使用して追加します。

Excelのクラッシュからの回復

コンピューターのリソースが不足すると、Excelがクラッシュする傾向があります。この演習の作成中に、まだ保存されていないExcelのスプレッドシートがフリーズしました。 コードウィンドウは部分的に応答し、ワークブック全体を閉じることができました。 結局のところ、ワークブックはコンテンツとコードが完成した状態で正常に再開されました。 テンポがあったraryおよびソースファイルが(非常に頻繁に)破損している場合、解決するツールがない場合は作業をやり直す必要があります。 xlsxダメージ。 この場合、それはほとんど重要ではありませんでしたが、より大きなワークブックにとっては潜在的な災害になる可能性があります。

著者紹介:

フェリックスフッカーは、のデータ復旧の専門家です DataNumen、Inc。は、以下を含むデータ復旧技術の世界的リーダーです。 回復します rar およびSQL回復ソフトウェア製品。 詳細については、次のWebサイトをご覧ください。 WWW。datanumen.com

今すぐ共有:

コメントは締め切りました。