关于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(“”,“”);

  • 请编辑您的问题并显示您收到错误的命令。
  • 删除空格和替换空格是有区别的!因此,如果您想在值的开头和结尾删除空格,您可以在 c# 中通过 trim() 执行此操作。还要注意 sql 不是为字符串操作而构建的,即使您可以执行大多数操作
  • @WiiMaxx我不仅想在结尾或开头删除它们,而是全部删除它们,我相信唯一的方法是将””替换为”,这基本上等于删除空间


如果您下载并安装了

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 位版本。

  • 请注意,Access 2016/2019 引擎 (Microsoft.ACE.OLEDB.16.0) 不支持 JET 3.0 数据库(Access 97 及更早版本),而且令人讨厌的是,ACE 16 驱动程序也将自身安装为 ACE 12 驱动程序的别名,因为有很多程序硬编码 Microsoft.ACE.OLEDB.12.0 到它们的连接字符串中,即使 ACE 12 支持 JET 3.0 数据库。嗯。 (出于同样的原因,Office 2013 中不可再分发的 ACE 15 驱动程序也取代了 ACE 12)。


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

    • 如果我使用双引号,则不会编译(我不能用单外引号定义字符串)
    • 如果我转义引号也不能解决任何问题
    • @Boyen。 . .你在使用你正在使用 MS Access 吗?
    • 是的,我使用的是 MS 2007 Access
    • -1 他们正在使用 Access 所谓的”ANSI-92″查询模式语法。
    • @onedaywhen 。 . .鉴于该问题没有说明使用 ANSI-92 查询模式,这似乎不是对答案投反对票的理由。相反,这将是询问 OP 的适当评论。
    • 我对您的回答投了反对票,因为它应该被删除,原因如下。 1) OP 发布了 ANSI-92 查询模式语法(或者,没有发布 ANSI-89 查询模式),这说明了很多关于 ANSI-92 查询模式的信息。 2)您怀疑 OP 正在使用 SQL Server 是错误的。 OP 几乎可以肯定使用 .NET Framework 中的 OleDbCommand,它始终使用 ANSI-92 查询语法。您未能识别 ANSI-92 查询模式语法并将其误认为是来自另一个 DBMS 的语法…
    • 3) 您发布了 ANSI-89 查询模式语法。即使 OP 想要, OleDbCommand 也不能使用 ANSI-89 查询语法。 4) 您继续使用 REPLACE 函数,该函数对 OleDbCommand 对象不可用。这就是问题的症结所在:OleDbCommand 不能使用 REPLACE 函数。虽然 REPLACE 可以在 Access 用户界面(任一查询模式)中使用,但您不能在 Access UI 中使用 .NET Framework。 5)您对引号问题的暗示是错误的。 OPa€?s 问题与引号无关…
    • 总之,您误解了 ANSI-92 查询模式的使用,发布了 OP 不能使用的语法,没有意识到 REPLACE 不能被 OP 使用,关于 ANSI-92 查询模式的永久错误信息与 SQL Server 有某种关系并无缘无故地提到了引号的问题。那么告诉我,你认为答案的哪一部分值得保留?



    如果您可以将 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 + ‘%'”;

    你好,

    阿德福斯

    • 我不知道在哪里使用它,我想在我的 c# 项目中这样做
    • 如果您有可能更改 Access DB,您可以添加一个模块并将上面的代码放入其中。在上面的 Gordon Linoffs 回答中,您应该写: ” “, “” 而不是:””,” => you need to escape” 然后它应该编译
    • 我没有这种可能性(在大约 300 台计算机上运行),我会尝试的
    • 您可以编译它并显示相同的错误消息吗?
    • 我猜在旧版本的 VB/VBA 中没有内置函数 Replace。请参阅:vbarchiv.net/commands/cmd_replace.html – 如果没有额外的模块,我不知道如何解决这个问题。对不起。
    • 用 VB 是指 Visual Basic 吗?因为这是 C# 代码
    • 您使用 C# OleDBCommand 调用访问 2007 DB 上的查询。我认为问题在于,无法在您的 strSql 字符串中使用 Access 函数 Replace,因为它说:”您根本没有使用 Access 查询引擎”。 Access 2007 本身支持 VBA 功能 Replace – 它已经足够新了。
    • 我猜他们有同样的问题:stackoverflow.com/questions/4834536/… => 他们用丑陋的 INSTR / MID 解决了这个问题…也许这可以帮助你?
    • 最后但并非最不重要的还有一个额外的解决方案:forums.codeguru.com/…


    来源:https://www.codenong.com/24908724/

    微信公众号
    手机浏览(小程序)
    0
    分享到:
    没有账号? 忘记密码?