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 Developer 但不适用于 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)));

如果我只尝试这个,我知道它会起作用,但我必须检查其他的东西。

string query = string.Format(@"SELECT * FROM {0} WHERE CODIPROD = :CODIPROD", TABLE);
List<OracleParameter> parameters = new List<OracleParameter>();
parameters.Add(new OracleParameter(":CODIPROD", id));

更新

我正在使用retun:

OracleCommand 命令;command.ExecuteReader();

更新

我尝试将Unicode=True放在 ConnectionString 上,但没有

更新

这就是我执行查询的方式。没有重音的字符一切正常:

OracleConnection connection = new OracleConnection();
connection.Open();

OracleTransaction transaction;
transaction = connection.BeginTransaction();

OracleCommand command;
command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText = commandText;

OracleParameter parameter;
command.Parameters.Add(parameter);

reader = command.ExecuteReader();

while (reader.Read())
{
    // Get data
}

所以,最后一次尝试(昨天下午 5 点)我做了这个:

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

并且工作正常。但是这种方式我知道是不对的。

4

2 回答 2

0

您以错误的顺序调用函数。TRANSLATE 函数区分大小写。因此,您必须在翻译之前使字符串小写。

SELECT * FROM {0}
WHERE TRANSLATE(LOWER(DESCSITE), {2}) LIKE TRANSLATE({1}, {2})

此外,第二个LOWER是多余的,因为你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));
        }
    }
}
于 2013-01-08T17:46:42.583 回答
-1

我已经解决了它在我的connectionString中添加这个(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')";
于 2014-10-20T14:29:47.887 回答