尝试对MS Access执行"REPLACE"时出现异常

haa*_*gel 7 .net ms-access replace

我正在尝试对包含"REPLACE"函数的MS Access数据库执行SQL查询:

UPDATE MyTable 
   SET MyColumn = REPLACE(MyColumn, 'MyOldSubstring', 'MyNewSubstring') 
 WHERE Id = 10;
Run Code Online (Sandbox Code Playgroud)

如果我从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()
       ...
Run Code Online (Sandbox Code Playgroud)

为什么我会得到这个例外?

更多信息:

  • 我的应用程序是WPF应用程序
  • 我正在使用.NET 3.5
  • 我运行MS Access 2007
  • 我的connectionstring是"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

(为简洁起见,删除了一些代码,例如错误处理.请注意,我只是构建一个快速原型,所以这个管道代码永远不会被用于真实,所以请耐心等待.)我仍然需要这个工作虽然.. .)

替代方案?

如果不可能让REPLACE工作,也许您知道一些替代解决方案?我可以获取我想要更新的所有行,在代码中执行此字符串替换,然后更新数据库中的行.但这可能是很多SQL查询(一个用于获取,一个用于每行更新)并且不是一个非常优雅的解决方案......

Dav*_*ton 6

在交互式 Access 中,Access Expression Service 负责为您提供对用户定义函数和 VBA 函数的访问权限,但 Access Expression Service 无法从 Access 外部使用。通过 ODBC 或 OLEDB 访问 Jet/ACE 数据时,只能使用有限数量的功能。Replace() 不是其中之一。但是,您可以使用 InStr() 和 Len() 来复制 Replace() 函数的功能,但这会相当难看。


one*_*hen 5

这是不可能的REPLACE,也许你知道一些替代解决方案?

这是@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;
Run Code Online (Sandbox Code Playgroud)


小智 0

不确定这是否与您遇到的问题有关,但我在运行包含 Access 2010 中的替换功能的更新时遇到问题,该更新只会返回且没有错误 - 没有任何错误。我实际上是从 .NET 中的 OleDb 运行它,最后发现我需要设置一个注册表项来关闭“沙盒模式”。

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

希望有帮助。