C# SQL适用于Oracle SQL Developer,但不适用于C代码

C# SQL适用于Oracle SQL Developer,但不适用于C代码,c#,sql,oracle,C#,Sql,Oracle,如果我只在Oracle SQL Developer上执行,我就可以使用以下SQL: SELECT * FROM MYTABLE WHERE LOWER(TRANSLATE(DESCRIPTION, 'âáàãêéèîíìôóòõûúùç', 'aaaaeeeiiioooouuuc')) LIKE LOWER(TRANSLATE('%são paulo%', 'âáàãêéèîíìôóòõûúùç', 'aaaaeeeiiioooouuuc')) 但当在C代码上执行时,将无法工作。结果总是0

如果我只在Oracle SQL Developer上执行,我就可以使用以下SQL:

SELECT * FROM MYTABLE 
WHERE LOWER(TRANSLATE(DESCRIPTION, 'âáàãêéèîíìôóòõûúùç', 'aaaaeeeiiioooouuuc')) 
LIKE LOWER(TRANSLATE('%são paulo%', 'âáàãêéèîíìôóòõûúùç', 'aaaaeeeiiioooouuuc'))
但当在C代码上执行时,将无法工作。结果总是0

string translate = "'âáàãêéèîíìôóòõûúùç', 'aaaaeeeiiioooouuuc'";
string query = string.Format("SELECT * FROM {0} 
                             WHERE LOWER(TRANSLATE(DESCSITE, {2})) 
                             LIKE LOWER(TRANSLATE({1}, {2}))", 
                             TABLE, string.Format("'%{0}%'", str.ToLower()), translate);
更新

这是在断点中显示的方式:

SELECT * FROM PROD 
WHERE TRANSLATE(LOWER(DESCSITE), 'âáàãêéèîíìôóòõûúùç', 'aaaaeeeiiioooouuuc') 
LIKE TRANSLATE(LOWER('%macarrão%'), 'âáàãêéèîíìôóòõûúùç', 'aaaaeeeiiioooouuuc')
同样的问题。适用于Oracle SQL开发人员,但不适用于C代码

更新

我试过这个,但在这种情况下是不工作的

string query = string.Format("SELECT * FROM {0} 
                 WHERE LOWER(TRANSLATE(DESCSITE, {1})) 
                 LIKE LOWER(TRANSLATE(:DESCSITE, {1}))", TABLE, translate);
List<OracleParameter> parameters = new List<OracleParameter>();
parameters.Add(new OracleParameter(":DESCSITE", string.Format("'%{0}%'", str)));
昨天下午5点最后一次尝试时,我做了以下几点:

String x = "SELECT * FROM PROD WHERE TRANSLATE(LOWER(DESCSITE), 'âáàãêéèîíìôóòõûúùç', 'aaaaeeeiiioooouuuc') LIKE LOWER(TRANSLATE('%"+str+"%', 'âáàãêéèîíìôóòõûúùç', 'aaaaeeeiiioooouuuc'))";

而且效果很好。但是这样我知道这是不对的。

您调用函数的顺序不对。TRANSLATE函数区分大小写。因此,在翻译之前,必须将字符串的大小写改为小写

SELECT * FROM {0}
WHERE TRANSLATE(LOWER(DESCSITE), {2}) LIKE TRANSLATE({1}, {2})
另外,第二个下限是多余的,因为您已经使用str.ToLower了

更新

现在还不清楚您是如何真正执行查询的。下面是一个如何做到这一点的例子

string connectionString = "...";
string query = "...";
using (var connection = new OracleConnection(connectionString)) {
    var command = new OracleCommand(query);
    command.Parameters.Add(":DESCSITE", OracleType.NVarChar);
    connection.Open();
    using (OracleDataReader reader = command.ExecuteReader()) {
        int descSiteOrdinal = reader.GetOrdinal("DESCSITE");
        while (reader.Read()) {
            Console.WriteLine(reader.GetString(descSiteOrdinal));
        }
    }
}

我已经解决了在我的连接字符串中添加这个问题,比如Unicode=true;:

    protected string conexionOraclePruebas = @"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=xxx)(HOST=xxx)(PORT=xxx)))(CONNECT_DATA=(SERVER=xxx)(SERVICE_NAME=xxx)));"
+ " User Id=xxx;Password=xxx;Min Pool Size=x;Connection Lifetime=x; "
+ " Unicode=true;";
我的问题是:

query += " AND translate(UPPER(" + field + "), 'ÁÉÍÓÚÀÈÌÒÙÃÊÎÕÛÂÄËÏÖÔÜÇÑ', 'AEIOUAEIOUAEIOUAAEIOOUCN') "
+"LIKE translate(UPPER('%" + this.value.ToString() + "%'), 'ÁÉÍÓÚÀÈÌÒÙÃÊÎÕÛÂÄËÏÖÔÜÇÑ', 'AEIOUAEIOUAEIOUAAEIOOUCN')";

如果在查询上设置断点,它会是什么样子?与正常工作的SQL相比,它是否符合预期?如果直接运行同一个SQL会发生什么?使用TRANSLATELOWER不是更有意义吗。。。而不是低翻译。。。?或者你的数据不包含带重音符号的大写字母吗?@DaveZych:参数translate不是用来替换{2}占位符的吗?这将是一个缓慢的执行过程,谢天谢地,Oracle应该足够聪明,可以在一次扫描表中完成这项工作,而不是两次,但它将在描述中运行3次。。。可能您的oracle版本是否允许您保存“派生”列或计算列?这至少意味着你不总是在做LOWER和TRANSLATE,尽管这不会使你免于通配符搜索。你在sql developerDESCRIPTION和C代码的sql查询中的列是diffDESCSITE.SELECT*from{0},其中TRANSLATELOWERDESCSITE,{2}类似于TRANSLATE{1},{2}相同=/不相同working@user1958882-请用新信息更新您的问题。我尝试过清理一下这个答案,但可能会通过代码块中的一些换行和/或缩进来改进。我对SQL不太熟悉,不能说它们应该去哪里。
    protected string conexionOraclePruebas = @"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=xxx)(HOST=xxx)(PORT=xxx)))(CONNECT_DATA=(SERVER=xxx)(SERVICE_NAME=xxx)));"
+ " User Id=xxx;Password=xxx;Min Pool Size=x;Connection Lifetime=x; "
+ " Unicode=true;";
query += " AND translate(UPPER(" + field + "), 'ÁÉÍÓÚÀÈÌÒÙÃÊÎÕÛÂÄËÏÖÔÜÇÑ', 'AEIOUAEIOUAEIOUAAEIOOUCN') "
+"LIKE translate(UPPER('%" + this.value.ToString() + "%'), 'ÁÉÍÓÚÀÈÌÒÙÃÊÎÕÛÂÄËÏÖÔÜÇÑ', 'AEIOUAEIOUAEIOUAAEIOOUCN')";