当我尝试在字符串查询的帮助下从oracle数据库中提取行时,我遇到了问题。如果我尝试用普通字符搜索一行,我的查询工作,如果我尝试用中文字符更改我的查询没有找到任何行。
conn.Open()
cmd.Connection = conn
cmd.CommandText = "select DIRNAME from PROJECTINFO where UPPER(NAME) = UPPER('" + projFullName + "')"
cmd.CommandType = CommandType.Text
dr = cmd.ExecuteReader()
If dr.Read() Then
strProjRawDataSharePath = dr.Item("DIRNAME")
Else
dr.Close()
dr.Dispose()
End If
dr.Close()
dr.Dispose()
如果我使用“默认”(projFullName =“Defaults”)从查询中搜索我的“projFullName”,我的查询工作表示,如果我使用projFullName =“中文版测试”进行更改,我的查询不会返回任何值,但是,我的数据库我有一个名为projFullName =“中文版测试”的项目。
您可能需要考虑使用NLS_UPPER而不是UPPER。
NLS_UPPER知道特定于语言的规则等,而UPPER仅适用于“英语”字符,而(IRC)会将这些字符转换为英文字符。
运行以下查询将并排显示数据,并可能会突出显示该问题。
select UPPER(Input.ChineseText), NLS_UPPER(Input.ChineseText)
from (select '中文版测试' as ChineseText from dual) Input;
或者,如果需要UPPER,可能值得考虑 - 使用UPPER意味着在查询执行中没有使用索引 - 但这不是这个问题的主题。
请使用如下所示的N修饰符来处理unicode字符串:
cmd.CommandText = "select DIRNAME from PROJECTINFO where NAME = N'" + projFullName + "'"
希望这可以帮助!
检查NLS_SORT中文,这是您可能需要的
Linguistic Sorting and String Searching
select DIRNAME from PROJECTINFO where NLS_UPPER(NAME, 'NLS_SORT =
SCHINESE_PINYIN_M') = '中文版测试'
我这样做: '“+ projFullName +”' “+'projFullName'+”
"select DIRNAME from PROJECTINFO where UPPER(NAME) = UPPER(+'中文版测试'+)"
测试这个没有定义,直接进入代码,因为VB代码中的引号似乎不正确,它们将结束Oracle SQL查询。
select UTL_I18N.RAW_TO_NCHAR(UTL_I18N.STRING_TO_RAW(NAME), 'ZHS16CGB231280') As NAME, UTL_I18N.RAW_TO_NCHAR(UTL_I18N.STRING_TO_RAW(DIRNAME), 'ZHS16CGB231280') As DIR FROM PROJECS"
此查询帮助我将deracle从oracle转换为中文字符