正如在这个问题中读到的那样:Undefined function 'Replace' in expression,我收到错误“未定义的函数'替换'在表达式中”,因为“你根本就没有使用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函数相同的问题,但是,我修改了我的OleDb连接与Odbc连接,如下所示:
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,但这不是一个适合您的解决方案:
这对你有帮助吗?
问候
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函数,但由于引号问题,它可能无法识别它。
如果您可以将VBA代码放在Access模块中,则可以在Access VBA中使用此代码将String替换为其他String而不是使用buliltin访问函数替换:
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
根据我的经验,我认为Gord Thompson的答案是正确的。我安装了Microsoft Access数据库引擎2007(只有32位版本)和64位Microsoft Access数据库引擎2010可再发行组件。当我以32位发布我的.net Click Once App时,我遇到了错误,当我以64位发布时,情况进展顺利。我进一步尝试,卸载Microsoft Access数据库引擎2007(只有32位版本)和64位Microsoft Access数据库引擎2010可再发行组件,安装32位Microsoft Access数据库引擎2010可再发行组件,然后再次以32位发布我的应用程序,一切是有序的。