Eccezione durante il tentativo di eseguire “REPLACE” contro MS Access

Sto cercando di eseguire una query SQL su un database MS Access contenente una funzione “REPLACE”:

UPDATE MyTable SET MyColumn = REPLACE(MyColumn, 'MyOldSubstring', 'MyNewSubstring') WHERE Id = 10; 

Se eseguo questa query da MS Access (l’applicazione) funziona correttamente. Ma quando provo ad eseguirlo dalla mia applicazione viene lanciata un’eccezione.

L’eccezione:

 System.Data.OleDb.OleDbException was unhandled Message="Undefined function 'REPLACE' in expression." Source="Microsoft Office Access Database Engine" ErrorCode=-2147217900 StackTrace: at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteNonQuery() ... 

Perché ottengo questa eccezione?

Ulteriori informazioni:

  • La mia applicazione è un’applicazione WPF
  • Sto usando .NET 3.5
  • Corro MS Access 2007
  • Il mio connectiontring è “Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C: \ MyFolder \ MyDatabase.accdb”

Il mio codice di accesso al database è simile a questo, dove passerò semplicemente l’SQL menzionato come una stringa:

 public void ExecuteNonQuery(string sql) { OleDbCommand command = new OleDbCommand(sql); OleDbConnection connection = new OleDbConnection(ConnectionString); command.Connection = connection; try { connection.Open(); command.ExecuteNonQuery(); } catch { throw; } finally { connection.Close(); } } 

(Alcuni codici, come la gestione degli errori, sono stati rimossi per brevità. Osservo che sto solo costruendo un prototipo rapido, quindi questo codice idraulico non verrà mai utilizzato per davvero, quindi ti prego di sopportarlo.) Ho ancora bisogno di questo per funzionare comunque .. .)

Soluzione alternativa?

Se è imansible far funzionare la SOSTITUZIONE, forse sai qualche soluzione alternativa? Potrei recuperare tutte le righe che voglio aggiornare, fare questa stringa sostituire nel codice e quindi aggiornare le righe nel database. Ma potrebbe trattarsi di molte query SQL (una da recuperare e una per ogni riga da aggiornare) e non sarebbe una soluzione molto elegante …

Nell’accesso interattivo, Access Expression Service si occupa di fornire l’accesso alle funzioni VBA definite dall’utente, ma Access Access Expression Service non è disponibile dall’esterno Access. Quando si accede a dati Jet / ACE tramite ODBC o OLEDB, è disponibile solo un numero limitato di funzioni. Sostituisci () non è uno di questi. Tuttavia, potresti essere in grado di utilizzare InStr () e Len () per replicare la funzionalità della funzione Replace (), ma sarebbe abbastanza brutto.

è imansible far funzionare la REPLACE , forse sai qualche soluzione alternativa?

Ecco l’approccio alternativo “abbastanza brutto” di cui parla @ David-W-Fenton:

 UPDATE MyTable SET MyColumn = MID( MyColumn, 1, INSTR(MyColumn, 'MyOldSubstring') - 1 ) + 'MyNewSubstring' + MID( MyColumn, INSTR(MyColumn, 'MyOldSubstring') + LEN('MyOldSubstring'), LEN(MyColumn) - INSTR(MyColumn, 'MyOldSubstring') - LEN('MyOldSubstring') + 1 ) WHERE INSTR(MyColumn, 'MyOldSubstring') > 0 AND Id = 10; 

Non sono sicuro se questo è correlato al problema riscontrato ma stavo riscontrando un problema durante l’esecuzione di un aggiornamento che conteneva una funzione di sostituzione in Access 2010 che sarebbe appena ritornata senza errori – nulla. In realtà lo stavo eseguendo da OleDb in .NET e alla fine ho capito che avevo bisogno di impostare una chiave di registro per distriggersre la “Modalità sandbox”.

http://office.microsoft.com/en-us/access-help/use-sandbox-mode-in-access-2007-HA010167429.aspx

Spero possa aiutare.

Confermo che “Modalità sandbox” risolve il problema con la funzione “Sostituisci”.

Dettagli della modalità sandbox: https://support.office.com/en-au/article/Functions-and-properties-in-Access-2007-blocked-by-sandbox-mode-9a829783-f7a8-4a9f-8d43-8650b8cc9565