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

标签 .net ms-access replace

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

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

如果我从 MS Access(应用程序)内部运行此查询,它工作正常。但是当我尝试从我的应用程序运行它时,会引发异常。

异常(exception):
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;Data Source=C:\MyFolder\MyDatabase.accdb”

  • 我的数据库 Access 代码如下所示,我将在其中将提到的 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();
        }
    }
    

    (为简洁起见,删除了一些像错误处理这样的代码。请注意,我只是在构建一个快速原型(prototype),所以这个管道代码永远不会被真正使用,所以请耐心等待。;)我仍然需要它来工作。 .)

    替代解决方案?

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

    最佳答案

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

    关于.net - 尝试对 MS Access 执行 "REPLACE"时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4834536/

    相关文章:

    .net - MonoTouch 中的 System.Runtime.Caching.MemoryCache

    c# - Nz 和 IIF 的替代方案(为空)

    javascript - 正则表达式从一行中提取单词

    linux - 在文件中搜索字符串并使用 awk 更改下一行

    c# - WebBrowser.url 在 winform 中有时不工作

    c# - 过滤 ICollectionView 中的重复条目

    .net - 我想在 C# 构建期间运行脚本,但**仅当项目不是最新时**

    database - 插入错误 : Syntax error and Unknown field

    delphi - 如何将 TMemo 组件中的多行添加到 MS Access 数据库?

    regex - 在 Notepad++ 中使用查找和替换时引用正则表达式