关于c#:表达式中的未定义函数”替换”,替换替代?

Undefined function 'Replace' in expression , Replace alternative?

正如在这个问题中所读:Undefined function \\'Replace\\' in expression,我收到错误 "Undefined function \\'Replace\\' in expression",因为 "you're not using the Access查询引擎",但我可以使用什么作为替代方案?显然"Iif,Instr 的组合"会起作用,但我找不到用这些实际替换某些东西的方法。

我只想从值中删除空格,我该怎么做?

1
2
3
4
5
6
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 数据库引擎 2010 可再发行组件

那么您可以在 OleDbConnection 对象的连接字符串中使用以下内容...

Provider=Microsoft.ACE.OLEDB.12.0

...和 ??REPLACE() 函数将可用于您的查询。例如,以下代码适用于我:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 连接来修复,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
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: Exception when trying to execute a€?REPLACEa€?针对 MS Access => 他们使用 INSTR / MID 解决了它......也许这可以帮助你?

  • 还有一个额外的解决方案:参见:Codeguru: Replace doesnt work...

  • 这对你有帮助吗?

    你好

    阿德福斯


    根据我的经验,我认为 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 Access Database Engine 2010 Redistributable,然后再次以 32 位发布了我的应用程序,一切秩序井然。


    我怀疑问题在于您使用的是 SQL Server 语法而不是 MS Access 语法。我认为这是 MS Access 版本:

    1
    2
    3
    4
    5
    6
    7
    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 中使用此代码将字符串替换为其他字符串,而不是使用 buliltin Access Function Replace:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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

    使用以下代码测试此代码:

    1
    2
    3
    4
    5
    6
    7
    Sub test()

    Dim test As String

    test = TransformString(" xyzABC ABCxyz","","")

    End Sub

    这等同于:

    1
    test = Replace(" xyzABC ABCxyz","","")

    两种情况都有结果:

    1
    "xyzABCABCxyz"

    然后这应该可以工作(使用额外的转义"作为"):

    1
    2
    3
    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 + '%'";

    你好,

    阿德福斯