我正在尝试对包含“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()
...
为什么会出现此异常?
更多信息:
我的数据库访问代码看起来像这样,我只是将提到的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查询(一个用于获取,一个用于每行更新)并且不是一个非常优雅的解决方案......
答案 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)