SQL Server folosește perechi de ghilimele simple pentru a identifica începutul și sfârșitul unui șir de caractere. Introducerea cuvântului „Mrs Brown's Boys” într-un tabel de bază de date va eșua, deoarece cele trei ghilimele simple implică două șiruri de caractere, dintre care unul este incomplet. Este necesar un caracter escape pentru apostroful de după Brown. Acest articol explorează utilizarea unei funcții VBA personalizate pentru a rezolva această anomalie.
Acest articol presupune că cititorul are afișată panglica pentru dezvoltatori și este familiarizat cu Editorul VBA. Dacă nu, vă rugăm să Google „Fila Dezvoltator Excel” sau „Fereastra Cod Excel”.
Termenul „bază de date” aici se aplică bazelor de date „industriale”, cum ar fi SQL Server și Oracle.
Un exemplu de registru de lucru folosit în acest exercițiu poate fi găsit aici.
Șirul SQL
Includerea apostrofurilor (sau a ghilimelelor simple) într-o instrucțiune SQL generează următoarea eroare returnată de managerul de baze de date (în acest caz, pentru numele O'Dowd):
Este necesar un caracter de escape, adică un apostrof dublu în loc de unul simplu. Prin urmare, O”Dowd este acceptabil pentru baza de date. O’Dowd nu este.
Functia
În cazul în care câmpurile de captură ar putea conține un apostrof, se poate construi o funcție personalizată care să se declanșeze înainte de actualizare, înlocuind apostroful simplu cu unul dublu.
- Deschideți un nou registru de lucru;
- Denumiți prima foaie „Actualizare” și completați după cum urmează, folosind propriul nume de bază de date etc. Aceste câmpuri vor fi folosite pentru a construi un șir de conexiune la SQL Server.
- Deschideți fereastra de cod și inserați un modul. Folosiți elementele de meniu > Instrumente > Referințe pentru a face referire la bibliotecile ADO.
Copiați codul de mai jos în modul. Aceasta se conectează la baza de date.
Public connDB ca nou ADODB.Connection Public rs ca nou ADODB.Recordset Public strSQL ca șir Public strCriteria ca șir Sub ConnectDatabase() Dacă connDB.State = 1 Atunci connDB.Close On Error GoTo ErrConnect Dim strServer, strDBase, strUser, strPWD strServer = Foi(„Actualizare”).Range(„B2”) strDBase = Foi(„Actualizare”).Range(„B3”) strUser = Foi(„Actualizare”).Range(„B4”) strPWD = Foi(„ Update").Range("B5") Dacă strPWD > "" Atunci 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 'Autentificare Windows End If connDB.ConnectionTimeout = 30 connDB.Open strConnectionstring Ieșire Sub ErrConnect: MsgBox Err.Description End Sub
- Adăugați funcția în modul:
Funcția fRemoveApostrophe(strWord As String) Dim n As Integer Dim x As Integer x = 0 For n = 0 To 100 x = InStr(x + 2, strWord, "'") 'Găsește poziția apostrofurilor 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 End Function
- Ignorați funcția.
Sub IgnoreFunction() Apelează ConnectDatabase strCriteria = Sheets("Update").Range("B10") strSQL = "Inserează în tblCrewMember (LastName) valori ('" & strCriteria & "')" MsgBox strSQL & ". Această intrare SQL va eșua; rețineți cele trei apostrofuri." Debug.Print strSQL 'connDB.Execute (strSQL) End Sub
- Utilizați funcția
Sub UseFunction() Call ConnectDatabase strCriteria = Sheets("Update").Range("B15") strCriteria = fRemoveApostrophe(strCriteria) strSQL = "Inserează în tblCrewMember (LastName) valori ('" & strCriteria & "')" MsgBox strSQL & ". Această intrare SQL va reuși și va apărea în tabelul de date ca O'Dowd." Debug.Print strSQL 'connDB.Execute (strSQL) End Sub
- Completați Actualizează foaie de lucru după cum urmează, începând de la celulă A8:
- Atribuiți butoanele macrocomenzilor IgnoreFunction și UseFunction respectiv
Rezultatele
O casetă de mesaj va afișa rezultatele; nicio bază de date nu este actualizată fizic în acest exercițiu, dar, dacă doriți să faceți acest lucru, asigurați-vă că numele câmpurilor sunt compatibile cu baza dvs. de date și adăugați folosiți instrucțiunea VBA conndb.execute(strSQL)
Recuperarea din Excel se blochează
Excel este predispus la blocări atunci când computerul rămâne fără resurse. În timpul scrierii acestui exercițiu, foaia de calcul Excel, încă nesalvată, s-a blocat. Fereastra Cod a răspuns parțial, permițând închiderea întregului registru de lucru. După cum s-a dovedit, registrul de lucru s-a redeschis normal, cu conținutul și codul complete. Dacă fișierele temporare și sursă ar fi fost (prea frecvent) deteriorate, lucrarea ar fi trebuit refăcută în absența unui instrument pentru rezolvarea problemei. daune xlsx. A fost de puțină importanță în acest caz, dar ar putea fi un potențial dezastru pentru registrele de lucru mai mari.
Introducerea autorului:
Felix Hooker este un expert în recuperarea datelor DataNumen, Inc., care este lider mondial în tehnologiile de recuperare a datelor, inclusiv recuperați fișiere rar și produse software de recuperare sql. Pentru mai multe informații vizitați www.datanumen.com


