在这个问题中读到: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(" ", "");
答案 0 :(得分:7)
如果您下载并安装
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位版本的数据库引擎。
答案 1 :(得分:2)
我在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()
我希望这会有所帮助。
此致
答案 2 :(得分:1)
我最后在其他答案中对此进行了评论:遗憾的是,我的VBA代码无法与 OleDbCommand 一起使用,但这不是一个适合您的解决方案:
我猜他们遇到了同样的问题,请参阅:Stackoverflow: Exception when trying to execute “REPLACE” against MS Access =>他们与INSTR / MID合作......也许这可以帮到你?
还有一个额外的解决方案:请参阅:Codeguru: Replace doesnt work...
这对你有帮助吗?
问候
Adelphos
答案 3 :(得分:0)
如果您可以将VBA代码放入访问模块,则可以在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"
然后这应该有效(使用额外的转义"作为\"):
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
答案 4 :(得分:0)
我怀疑问题是您使用的是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功能,但由于报价问题,它可能无法识别它。
答案 5 :(得分:0)
根据我的经验,我认为汤普森(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访问Database Engine 2010 Redistributable ,然后再次以32位发布我的App,一切都按顺序进行。