Undefined function ‘Replace’ in expression , Replace alternative?
正如在这个问题中所读:Undefined function //’Replace//’ in expression,我收到错误 “Undefined function //’Replace//’ in expression”,因为 “you’re not using the Access查询引擎”,但我可以使用什么作为替代方案?显然”Iif,Instr 的组合”会起作用,但我找不到用这些实际替换某些东西的方法。
我只想从值中删除空格,我该怎么做?
1
2 3 4 5 6 |
const string strSql ="SELECT TOP 15 HOOFDGROEP.HOOFDGROEP, SUBGROEP.SUBGROEP, Artikels.*" + " FROM (Artikels LEFT JOIN HOOFDGROEP ON Artikels.HOOFDGROEPID = HOOFDGROEP.ID)" + " LEFT JOIN SUBGROEP ON Artikels.SUBGROEPID = SUBGROEP.ID WHERE REPLACE(ArtikelNaam, ‘ ‘, ”) LIKE ‘%’ + @ArtikelNaam + ‘%’"; var objCommand = new OleDbCommand(strSql, _objConnection); |
如果您下载并安装了
Microsoft Access 数据库引擎 2010 可再发行组件
那么您可以在
…和 ??
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using (var conn = new OleDbConnection())
{ conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + @"Data Source=C://__tmp//testData.accdb;"; conn.Open(); using (var cmd = new OleDbCommand()) { cmd.Connection = conn; cmd.CommandText = "UPDATE Table1 SET ProductType = Replace(ProductType, ‘ ‘, ”)"; cmd.ExecuteNonQuery(); } conn.Close(); } |
请注意,您需要下载并安装与 .NET 应用程序具有相同”位数”的 Access 数据库引擎版本:32 位应用程序需要 32 位版本的数据库引擎,而 64 位应用程序需要数据库引擎的 64 位版本。
我在使用 REPLACE 函数时遇到了同样的问题,但是,我通过使用 Odbc 连接更改我的 OleDb 连接来修复,如下所示:
1
2 3 4 5 6 7 8 9 10 11 12 13 |
Dim dbConn As New System.Data.Odbc.OdbcConnection dbConn.ConnectionString ="Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C://db_name.accdb;Uid=Admin;Pwd=;" dbConn.Open() Dim objCmd As New System.Data.Odbc.OdbcCommand() dbConn.Close() |
我希望这会有所帮助。
问候
我最后只在另一个答案中评论了它:不幸的是,我的 VBA 代码不适用于 OleDbCommand,但这不是适合您的解决方案吗:
因为我猜他们有同样的问题,请参阅:Stackoverflow: Exception when trying to execute a€?REPLACEa€?针对 MS Access => 他们使用 INSTR / MID 解决了它……也许这可以帮助你?
还有一个额外的解决方案:参见:Codeguru: Replace doesnt work…
这对你有帮助吗?
你好
阿德福斯
根据我的经验,我认为 Gord Thompson 的回答是正确的。我安装了 Microsoft Access Database Engine 2007(只有 32 位版本)和 64 位 Microsoft Access Database Engine 2010 Redistributable。当我以 32 位发布我的 .net Click Once App 时,我遇到了错误,当我以 64 位发布时,事情进展顺利。
我进一步尝试,卸载了 Microsoft Access Database Engine 2007(只有 32 位版本)和 64 位的 Microsoft Access Database Engine 2010 Redistributable,安装了 32 位 Microsoft Access Database Engine 2010 Redistributable,然后再次以 32 位发布了我的应用程序,一切秩序井然。
我怀疑问题在于您使用的是 SQL Server 语法而不是 MS Access 语法。我认为这是 MS Access 版本:
1
2 3 4 5 6 7 |
SELECT TOP 15 HOOFDGROEP.HOOFDGROEP, SUBGROEP.SUBGROEP, Artikels.*
FROM (Artikels LEFT JOIN HOOFDGROEP ON Artikels.HOOFDGROEPID = HOOFDGROEP.ID) LEFT JOIN SUBGROEP ON Artikels.SUBGROEPID = SUBGROEP.ID WHERE REPLACE(ArtikelNaam,"","") LIKE "*" & @ArtikelNaam &"*"; |
如果您可以将 VBA 代码放入 Access 模块中,则可以在 Access VBA 中使用此代码将字符串替换为其他字符串,而不是使用 buliltin Access Function Replace:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Public Function TransformString(ByVal ToTransformStr As String, ByVal ReplaceStr As String, ByVal ToReplaceStr As String) As String
Dim i As Long, sTmpString As String sTmpString ="" TransformString = sTmpString End Function |
使用以下代码测试此代码:
1
2 3 4 5 6 7 |
Sub test()
Dim test As String test = TransformString(" xyzABC ABCxyz","","") End Sub |
这等同于:
1
|
test = Replace(" xyzABC ABCxyz","","")
|
两种情况都有结果:
1
|
"xyzABCABCxyz"
|
然后这应该可以工作(使用额外的转义”作为”):
1
2 3 |
const string strSql ="SELECT TOP 15 HOOFDGROEP.HOOFDGROEP, SUBGROEP.SUBGROEP, Artikels.*" +
" FROM (Artikels LEFT JOIN HOOFDGROEP ON Artikels.HOOFDGROEPID = HOOFDGROEP.ID)" + " LEFT JOIN SUBGROEP ON Artikels.SUBGROEPID = SUBGROEP.ID WHERE TransformString(ArtikelNaam, " ", "") LIKE ‘%’ + @ArtikelNaam + ‘%’"; |
你好,
阿德福斯
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269596.html