0

OracleSQLDeveloperで実行するだけで機能するこの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'))";

そしてうまく動作します。しかし、このように私はそれが正しくないことを知っています。

4

2 に答える 2

0

関数を間違った順序で呼び出しています。TRANSLATE 関数は大文字と小文字を区別します。したがって、翻訳する前に文字列を小文字にする必要があります。

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

また、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 に答える