试图执行“替换”对MS Access时异常试图执行“替换”对MS Access时异常(Excepti

2019-05-12 08:18发布

我试图对含有“替换”功能的MS Access数据库执行SQL查询:

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中
  • 我的ConnectionString是 “提供者= 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查询(一个获取和每行一个更新),并不会是一个很优雅的解决方案...

Answer 1:

在交互式访问,访问表达式服务照顾您提供访问用户定义和VBA函数,但访问表达服务不能从外部访问。 访问通过ODBC或OLEDB喷气/ ACE数据时,只的功能的数量有限。 REPLACE()是不是其中之一。 但是,您可能能够使用InStr函数()和莱恩()来复制替换()函数的功能,但它会相当难看。



Answer 2:

它是不可能得到的REPLACE工作,也许你知道的一些替代解决方案?

这里的“相当丑陋”另类提到由@大卫-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;


Answer 3:

不知道这是关系到你有,但我在运行包含Access 2010中的一个替换功能,也只是没有返回错误的更新的问题时 - 什么都没有。 我其实是从的OleDb .NET中运行它,终于想通了,我需要设置一个注册表键关闭“沙盒模式”。

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

希望帮助。



Answer 4:

我确认“沙盒模式”与“替换”功能解决这个问题。

沙盒模式的详细信息: https://support.office.com/en-au/article/Functions-and-properties-in-Access-2007-blocked-by-sandbox-mode-9a829783-f7a8-4a9f-8d43-8650b8cc9565



文章来源: Exception when trying to execute “REPLACE” against MS Access