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

时间:2011-01-29 01:34:22

标签: .net ms-access replace

我正在尝试对包含“REPLACE”函数的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是“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();
    }
}

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

替代解决方案?

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

  

无法获得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;

答案 2 :(得分:0)

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

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

希望有所帮助。

答案 3 :(得分:0)

我确认“沙盒模式”修复了“替换”功能的问题。

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