表达式中未定义的函数'Replace',替换替代?

问题描述 投票:3回答:6

正如在这个问题中读到的那样: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(" ", "");
c# sql ms-access oledbcommand
6个回答
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位应用程序位版本的数据库引擎。


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()

我希望这有帮助。

问候


1
投票

我最后在其他答案中对此进行了评论:遗憾的是我的VBA代码不适用于OleDbCommand,但这不是一个适合您的解决方案:

  1. 因为我猜他们有同样的问题,请参阅:Stackoverflow: Exception when trying to execute “REPLACE” against MS Access =>他们与INSTR / MID合作...也许这可以帮到你?
  2. 还有一个额外的解决方案:请参阅:Codeguru: Replace doesnt work...

这对你有帮助吗?

问候

Adelphos


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函数,但由于引号问题,它可能无法识别它。


0
投票

如果您可以将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


0
投票

根据我的经验,我认为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位发布我的应用程序,一切是有序的。

© www.soinside.com 2019 - 2024. All rights reserved.