未定义函数'在表达式中,替换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(" ", "");

未定义函数'在表达式中,替换alternative

如果你下载并安装了

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一起工作,但这不是一个解决方案吗?

  1. 因为我猜他们也有同样的问题,请参阅:Stackoverflow:尝试对MS Access执行"REPLACE"时出现异常=>他们用INSTR/MID解决了这个问题…也许这能帮到你?

  2. 还有一个额外的解决方案:参见: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位发布我的应用程序,一切都是有序的。