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

时间:2013-01-08 17:13:24

标签: c# sql oracle

如果我只是在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却();

更新

我尝试在ConnectionString上添加 Unicode = True ,但没有

更新

这就是我执行查询的方式。对于没有重音的角色,一切都很好:

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'))";

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

2 个答案:

答案 0 :(得分: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));
        }
    }
}

答案 1 :(得分:-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')";