Estoy tratando de ejecutar una consulta SQL en una base de datos de MS Access que contiene una función "reemplazar":Excepción al intentar ejecutar "reemplazar" en contra de MS Access
UPDATE MyTable
SET MyColumn = REPLACE(MyColumn, 'MyOldSubstring', 'MyNewSubstring')
WHERE Id = 10;
Si me quedo esta consulta desde el interior de la EM Access (la aplicación) funciona bien. Pero cuando intento ejecutarlo desde mi aplicación, se lanza una excepción.
La excepción:
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()
...
¿Por qué recibo esta excepción?
Más información:
- Mi aplicación es una aplicación de WPF
- estoy usando .NET 3.5
- corro MS Access 2007
- Mi connectionstring es "Provider = Microsoft.ACE .OLEDB.12.0; Origen de datos = C: \ MyFolder \ MyDatabase.accdb "
Mi código de acceso a la base de datos se ve más o menos así, donde voy a pasar en el SQL mencionado como una cadena:
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();
}
}
(Algunos código como el manejo de errores removido por razones de brevedad. Observe que solo estoy construyendo un prototipo rápido para que este código de plomería nunca se use de verdad, así que tenga paciencia. ;) Todavía necesito que esto funcione ...)
¿Solución alternativa?
Si no puede hacer que el REEMPLAZO funcione, ¿tal vez conozca alguna solución alternativa? Podría buscar todas las filas que quiero actualizar, hacer esta cadena reemplazar en el código y luego actualizar las filas en la base de datos. Pero eso podría ser una gran cantidad de consultas SQL (una para buscar y otra para cada fila para actualizar) y no sería una solución muy elegante ...
Es una buena respuesta, pero no resuelve la cuestión carteles. –
No tengo una solución (¡nunca trabajo fuera de Access!), Pero esperaba que señalar esto podría llevar a una respuesta de alguien que podría ayudar, tal vez alguien dispuesto a hackear juntos la fea expresión requerida usando InStr() y Len() para hacer el trabajo. –
"tal vez alguien dispuesto a hackear juntos la fea expresión requerida" - hecho! ;) – onedaywhen