C# SQL适用于Oracle SQL Developer,但不适用于C代码
如果我只在Oracle SQL Developer上执行,我就可以使用以下SQL: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
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')";