Исключение при попытке выполнить «ЗАМЕНА» против MS Access - PullRequest
7 голосов
/ 29 января 2011

Я пытаюсь выполнить SQL-запрос к базе данных MS Access, содержащей функцию «ЗАМЕНА»:

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

Если я запускаю этот запрос из MS Access (приложения), он работает нормально.Но когда я пытаюсь запустить его из своего приложения, выдается исключение.

Исключение:

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()
       ...

Почему я получаю это исключение?

Дополнительная информация:

  • Мое приложение является приложением WPF
  • Я использую .NET 3.5
  • Я использую MS Access 2007
  • Моя строка подключения: «Provider = Microsoft.ACE.OLEDB.12.0; Источник данных = C: \ MyFolder \ MyDatabase.accdb"

Мой код доступа к базе данных выглядит примерно так, и я просто передамв упомянутом SQL в виде строки:

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();
    }
}

(Некоторый код, такой как обработка ошибок, удален для краткости. Обратите внимание, что я создаю только быстрый прототип, поэтому этот код никогда не будет использоватьсяна самом деле, поэтому, пожалуйста, потерпите.;) Мне все еще нужно, чтобы это работало, хотя ...)

Альтернативное решение?

Если это невозможночтобы заставить ЗАМЕНУ работать, может быть, вы знаете какое-то альтернативное решение?Я мог бы извлечь все строки, которые я хочу обновить, заменить эту строку в коде, а затем обновить строки в базе данных.Но это может быть много SQL-запросов (один для извлечения и один для каждой строки для обновления), и это не будет очень элегантным решением ...

Ответы [ 4 ]

4 голосов
/ 06 февраля 2011

В интерактивном доступе служба выражений доступа обеспечивает доступ к пользовательским функциям и функциям VBA, но служба выражений доступа недоступна извне Access. При доступе к данным Jet / ACE через ODBC или OLEDB доступно только ограниченное количество функций. Replace () не является одним из них. Однако вы можете использовать InStr () и Len () для репликации функциональности функции Replace (), но это будет довольно уродливо.

4 голосов
/ 09 февраля 2011

невозможно заставить REPLACE работать, может быть, вы знаете какое-то альтернативное решение?

Вот "довольно уродливый" альтернативный подход, на который ссылается @ David-W-Фентон:

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;
0 голосов
/ 18 июня 2015

Я подтверждаю, что «Режим песочницы» устраняет проблему с функцией «Заменить».

Подробная информация о режиме песочницы: https://support.office.com/en-au/article/Functions-and-properties-in-Access-2007-blocked-by-sandbox-mode-9a829783-f7a8-4a9f-8d43-8650b8cc9565

0 голосов
/ 04 февраля 2011

Не уверен, если это связано с вашей проблемой, но у меня была проблема при запуске обновления, содержащего функцию замены в Access 2010, которая просто возвращала бы без ошибок - ничего. Я фактически запускал его из OleDb в .NET и наконец понял, что мне нужно установить ключ реестра, чтобы отключить «режим песочницы».

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...