haa*_*gel 7 .net ms-access replace
我正在尝试对包含"REPLACE"函数的MS Access数据库执行SQL查询:
UPDATE MyTable
SET MyColumn = REPLACE(MyColumn, 'MyOldSubstring', 'MyNewSubstring')
WHERE Id = 10;
Run Code Online (Sandbox Code Playgroud)
如果我从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()
...
Run Code Online (Sandbox Code Playgroud)
为什么我会得到这个例外?
更多信息:
我的数据库访问代码看起来像这样,我只是将提到的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();
}
}
Run Code Online (Sandbox Code Playgroud)
(为简洁起见,删除了一些代码,例如错误处理.请注意,我只是构建一个快速原型,所以这个管道代码永远不会被用于真实,所以请耐心等待.)我仍然需要这个工作虽然.. .)
替代方案?
如果不可能让REPLACE工作,也许您知道一些替代解决方案?我可以获取我想要更新的所有行,在代码中执行此字符串替换,然后更新数据库中的行.但这可能是很多SQL查询(一个用于获取,一个用于每行更新)并且不是一个非常优雅的解决方案......
在交互式 Access 中,Access Expression Service 负责为您提供对用户定义函数和 VBA 函数的访问权限,但 Access Expression Service 无法从 Access 外部使用。通过 ODBC 或 OLEDB 访问 Jet/ACE 数据时,只能使用有限数量的功能。Replace() 不是其中之一。但是,您可以使用 InStr() 和 Len() 来复制 Replace() 函数的功能,但这会相当难看。
这是不可能的
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;
Run Code Online (Sandbox Code Playgroud)
小智 0
不确定这是否与您遇到的问题有关,但我在运行包含 Access 2010 中的替换功能的更新时遇到问题,该更新只会返回且没有错误 - 没有任何错误。我实际上是从 .NET 中的 OleDb 运行它,最后发现我需要设置一个注册表项来关闭“沙盒模式”。
http://office.microsoft.com/en-us/access-help/use-sandbox-mode-in-access-2007-HA010167429.aspx
希望有帮助。