未定义函数'在表达式中,替换alternative
本文关键字:替换 alternative 表达式 函数 未定义 | 更新日期: 2023-09-27 18:14:26
如下所示:Undefined function '在表达式中,我得到错误"表达式中未定义的函数'替换'",因为"你根本不使用Access查询引擎",但我用什么作为替代?显然,"Iif, Instr的组合"可以工作,但我找不到一种方法来实际替换这些东西。
所有我想要的是删除一个值的空格,我该怎么做?
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);
objCommand.Parameters.Add("@ArtikelNaam", OleDbType.Char).Value = naamZoeker.Replace(" ", "");
如果你下载并安装了
Microsoft Access Database Engine 2010 Redistributable
,那么您可以在OleDbConnection
对象的连接字符串中使用以下内容…
Provider=Microsoft.ACE.OLEDB.12.0
…Replace()
函数将对您的查询可用。例如,下面的代码为我工作:
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连接来修复,如下所示:
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()
With objCmd
.Connection = dbConn
.CommandType = CommandType.Text
.CommandText = "UPDATE table_name SET target_field = Replace(source_field, ' ', '') "
End With
objCmd.ExecuteNonQuery()
dbConn.Close()
我希望这对你有帮助。
对
我最后才在我的另一个答案中评论它:我的VBA代码不幸不能与OleDbCommand一起工作,但这不是一个解决方案吗?
-
因为我猜他们也有同样的问题,请参阅:Stackoverflow:尝试对MS Access执行"REPLACE"时出现异常=>他们用INSTR/MID解决了这个问题…也许这能帮到你?
-
还有一个额外的解决方案:参见:Codeguru: Replace does work…
这个对你有帮助吗?
的问候Adelphos
如果您可以将VBA代码放在Access Module中,则可以在Access VBA中使用此代码将字符串替换为其他字符串,而不是使用内置访问函数 replace :
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 = ""
For i = 1 To Len(ToTransformStr)
If Mid$(ToTransformStr, i, Len(ReplaceStr)) = ReplaceStr Then
sTmpString = sTmpString & ToReplaceStr
If Len(ReplaceStr) > 1 Then
i = i + Len(ReplaceStr) - 1
End If
Else
sTmpString = sTmpString & Mid$(ToTransformStr, i, 1)
End If
Next i
TransformString = sTmpString
End Function
用:
测试代码Sub test()
Dim test As String
test = TransformString(" xyzABC ABCxyz ", " ", "")
End Sub
这与
相同test = Replace(" xyzABC ABCxyz ", " ", "")
结果在两种情况下:
"xyzABCABCxyz"
然后这应该可以工作(使用额外的转义" as '"):
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 + '%'";
问候,
Adelphos
我怀疑问题是你正在使用SQL Server语法而不是MS Access语法。我想这是MS Access版本:
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 & "*";
REPLACE()
是一个MS Access功能,但也许它不识别它,因为引号的问题。
根据我的经验,我认为Gord Thompson的答案是正确的。我有Microsoft Access Database Engine 2007(只有32位版本)和64位的Microsoft Access Database Engine 2010 Redistributable安装。当我以32位发布我的。net Click Once应用程序时,我遇到了错误,当我以64位发布时,事情进展顺利。我进一步尝试,卸载了Microsoft Access Database Engine 2007(只有32位版本)和64位的Microsoft Access Database Engine 2010 Redistributable,安装了32位Microsoft Access Database Engine 2010 Redistributable,然后再次以32位发布我的应用程序,一切都是有序的。