Ausnahme beim ausführen "ERSETZEN" gegen MS Access
Ich versuche zum ausführen einer SQL-Abfrage für eine MS Access-Datenbank mit einer "ERSETZEN" - Funktion:
UPDATE MyTable
SET MyColumn = REPLACE(MyColumn, 'MyOldSubstring', 'MyNewSubstring')
WHERE Id = 10;
Wenn ich diese Abfrage ausführen, die von innen MS Access (Anwendung) funktioniert es einwandfrei. Aber wenn ich versuche, führen Sie es aus meiner Anwendung eine exception geworfen wird.
Ausnahme:
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()
...
Warum erhalte ich diese exception?
Mehr info:
- Meine Anwendung eine WPF-Anwendung
- Ich mit .NET 3.5
- Ich ausführen von MS-Access-2007 -
- Mein connectionstring "Provider=Microsoft.Ass.OLEDB.12.0;Data Source=C:\MyFolder\MyDatabase.accdb"
Meine Datenbank access code sieht so ähnlich aus wie diese, wo ich einfach in den bereits erwähnten SQL als string:
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();
}
}
(Einige Codes, wie z.B. die Fehlerbehandlung aus Gründen der Kürze entfernt. Beachten Sie, dass ich bin nur der Aufbau einer schnellen Prototyp, so dass diese Sanitär-code wird nie verwendet werden, für die realen, also bitte Geduld mit ihm. 😉 Ich muss noch diese Arbeit, obwohl...)
Alternative Lösung?
Wenn es unmöglich ist, um die zu ERSETZEN, um zu arbeiten, vielleicht kennen Sie einige alternative Lösung? Ich konnte Holen alle die Zeilen, die ich aktualisieren möchten , tun Sie dies, string ersetzen im code, und aktualisieren Sie anschließend die Zeilen in der Datenbank. Aber das könnte eine Menge von SQL-Abfragen (eine zu Holen und man für jede zu aktualisierende Zeile) und es wäre keine sehr elegante Lösung...
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der interaktiven Zugriff, der Zugriff Expression Service kümmert sich um Sie bieten Zugriff auf benutzerdefinierte VBA-Funktionen, aber der Zugang Expression Service ist nicht verfügbar, von außerhalb Zugreifen. Beim Zugriff auf Jet/ACE-Daten über ODBC oder OLEDB, nur eine begrenzte Anzahl von Funktionen stehen zur Verfügung. Replace() ist nicht einer von Ihnen. Sie können jedoch in der Lage sein zu verwenden, InStr() und Len() zum replizieren der Funktionalität der Replace () - Funktion, aber es wäre ziemlich hässlich.
Hier ist der "ziemlich hässlich" alternative Ansatz angedeutet durch @David-W-Fenton:
INSTR(MyColumn, 'MyOldSubstring')
undLEN('MyOldSubstring')
jedes mal, wenn er trifft es, oder wird es bewerten, sobald und cache das Ergebnis? Ich weiß, dass die Jet/ACE-Abfrage-Optimierer, der smart ist mit "vertikale" Optimierung, d.h., die Bewertung nur einmal einen Ausdruck, der für alle Zeilen, aber ich mache mir sorgen, dass es nicht so schlau mit "horizontal" - Optimierung, also, das auswerten desselben Ausdrucks nur einmal pro Zeile. [Fortsetzung...]Len(MyField) AS Length1
undLen(MyField) + 3 As Length2
dass es nur einmal ausgewertet werden. Aber wenn die Ausdrücke werden Argumente an eine andere Funktion, ich habe Angst, dass Sie nicht ausgewertet werden effizient. Leider ist die Interaktion mit dem Jet/Access-Ausdrucks-services nicht dokumentiert in der SHOWPLAN -, so gibt es keine echte Möglichkeit zu wissen. Sie evaluieren können, wie die Aufrufe der Zugang expression service optimiert werden durch das schreiben von UDFs, die Ausgabe mit Debug.Drucken Sie jedes mal, wenn Sie aufgerufen werden, aber Sie würde das mit der nicht-SEF.Nicht sicher, ob dies ist verwandt zu dem problem, das Sie haben, aber ich hatte ein problem mit einem update, die ersetzen-Funktion in Access 2010, das würde nur wieder mit keine Fehler - nichts. Ich war eigentlich läuft es aus OleDb-in .NET und fand schließlich heraus, dass ich brauchte, um ein registry-Schlüssel zum deaktivieren von "Sandbox-Modus".
http://office.microsoft.com/en-us/access-help/use-sandbox-mode-in-access-2007-HA010167429.aspx
Hoffe, das hilft.
Ich bestätigen "Sandbox-Modus" lösen Sie das problem mit der "Ersetzen" - Funktion.
Details des Sandkasten-Modus : https://support.office.com/en-au/article/Functions-and-properties-in-Access-2007-blocked-by-sandbox-mode-9a829783-f7a8-4a9f-8d43-8650b8cc9565