我正在尝试对包含“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()
...
为什么我会得到这个异常?
更多信息:
我的数据库 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/