próbuję wykonać kwerendy SQL na bazie danych MS Access, zawierający funkcję „Replace”:wyjątek podczas próby wykonania „Zamień” przeciwko MS Access
UPDATE MyTable
SET MyColumn = REPLACE(MyColumn, 'MyOldSubstring', 'MyNewSubstring')
WHERE Id = 10;
Jeśli uruchomić tę kwerendę od wewnątrz MS Dostęp (aplikacja) działa dobrze. Ale kiedy próbuję uruchomić go z mojej aplikacji, wyjątek jest generowany.
Wyjątek:
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()
...
Dlaczego otrzymuję ten wyjątek?
Więcej informacji:
- Moja aplikacja jest aplikacją WPF
- Używam .NET 3.5
- uruchomić MS Access 2007
- Moja ConnectionString jest „Provider = Microsoft.ACE .OLEDB.12.0; Data Source = C: \ MójFolder \ MyDatabase.accdb "
Mój kod dostępu do bazy danych wygląda mniej więcej tak, gdzie będę po prostu przekazać we wspomnianym SQL jako ciąg:
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();
}
}
(Niektóre jak kod obsługi błędów usunięte dla zwięzłość. Zauważ, że buduję tylko szybki prototyp, więc ten kod instalacyjny nigdy nie będzie użyty na prawdę, więc proszę, proszę. ;) Nadal potrzebuję tego do pracy ...)
Alternatywne rozwiązanie?
Jeśli nie można uzyskać REPLACE do pracy, może znasz jakieś alternatywne rozwiązanie? Mogłem pobrać wszystkie wiersze, które chcę zaktualizować, zrobić ten ciąg w kodzie, a następnie zaktualizować wiersze w bazie danych. Ale może to być wiele zapytań SQL (jeden do pobrania i jeden do każdego wiersza do aktualizacji) i nie byłoby to bardzo eleganckie rozwiązanie ...
Jest to dobre rozwiązanie, ale nie rozwiązuje kwestię plakatów. –
Nie mam rozwiązania (nigdy nie pracuję poza Access!), Ale miałem nadzieję, że wskazanie tego może prowadzić do odpowiedzi od kogoś, kto może pomóc, być może ktoś, kto chce zhakować brzydkie wyrażenie wymagane za pomocą InStr() i Len(), aby wykonać zadanie. –
"Być może ktoś chce zhakować razem brzydki ekspres" - gotowe! ;) – onedaywhen