c#查询oracle表(US7ASCII字符集)时汉字出现乱码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#查询oracle表(US7ASCII字符集)时汉字出现乱码?相关的知识,希望对你有一定的参考价值。

c#中的代码如下:

protected void Button1_Click(object sender, EventArgs e)

string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST="
+ "(ADDRESS=(PROTOCOL=TCP)(HOST=17.11.10.48)(PORT=1521)))"
+ "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=data)));"
+ "User Id=cx;Password=123456;";
OracleConnection conn = new OracleConnection(oradb); // C#
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "select nsrmc from dj_nsrxx where nsrsbh = " + "'" + TextBox1.Text.ToString() + "'";
cmd.CommandType = System.Data.CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();

if (dr.Read()) // C#

Label2.Text = dr["nsrmc"].ToString();
//Label2.Text = dr["nsrmc"].ToString();

else

Label2.Text = "未找到记录";




结果显示为乱码,请高人解决!
服务器端的oracle表为US7ASCII字符集,不可更改。

客户端的注册表信息已改,但没用,还是乱码。

配置环境变量 nls_lang值如下:(使客户端字符集和服务器端一致)

select
t1.value||'_'||t2.VALUE||'.'||t3.VALUE AS Server
FROM nls_database_parameters t1,nls_database_parameters t2,nls_database_parameters t3
WHERE t1.PARAMETER='NLS_LANGUAGE'
AND t2.PARAMETER='NLS_TERRITORY'
AND t3.PARAMETER='NLS_CHARACTERSET'
参考技术A 修改Oracle客户端语言:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1下的NLS_LANG为SIMPLIFIED CHINESE_CHINA.ZHS16GBK

SIMPLIFIED CHINESE_CHINA.ZHS16GBK 为你的 US7ASCII追问

客户端的注册表信息已改,但没用,还是乱码。

追答

直接在 代码中 执行 一个命令 :set NLS_LANG = .... 看看是否可行 ?

追问

在c#中直接用set?没用过,好像不行吧?

追答

试过吗,不试怎么知道是否可行 ?

cmd.CommandText="set NLS_LANG = .... “;
....

参考技术B US7ASCII字符集 不支持UNICODE 字符吧, 你用 PL/SQL 或者 SQL PLUS 查询的结果,中文显示正常吗?追问

用 PL/SQL 或者 SQL PLUS 查询的结果,中文显示是正常的。

参考技术C 有可能是你存储格式的问题:你的汉字的存储格式是varchar吗?改成nvarchar试试。 参考技术D 你的客户端是oracle的不一致 应该比较困难解决的

从 C# 调用 oracle 函数

【中文标题】从 C# 调用 oracle 函数【英文标题】:Calling an oracle function from C# 【发布时间】:2009-08-27 07:52:11 【问题描述】:

我有一个 Oracle 函数 GetEmployeeDetails,它将所有员工详细信息保存到一个临时表 TempEmployeeDetails 表中。

我必须调用函数,然后对临时表进行选择查询。函数调用成功,但选择查询抛出以下错误。

"开始:输出:= MyPackage.GetEmployeeDetails(" + ":EmployeeId,");选择 * 从 TempEmployeeDetails;结束;"

上面的查询给了我这个错误:

ORA-06550:第 1 行,第 98 列:

PLS-00428:此 SELECT 语句中应有一个 INTO 子句

【问题讨论】:

【参考方案1】:

如果您使用的是 OracleClient,我认为您应该将查询与函数调用分开,因此代码可能是:

OracleCommand cmd = new OracleCommand("GetEmployeeDetails", conn);
cmd.CommandType = CommandType.StoredProcedure;


par = new OracleParameter("EmployeeId", OracleType.int32);
par.Value = EmployeeId;
par.Direction = ParameterDirection.Input;
cmd.Parameters.Add(par);

cmd.ExecuteNonQuery();

现在要从 tempEmployeeDetails 获取数据,请进行如下查询:

OracleCommand cmd = new OracleCommand("SELECT * FROM TempEmployeeDetails", conn);
OracleDataReader dr = cmd.ExecuteReader();
while (dr.Read())

   //do what you want...

【讨论】:

以上是关于c#查询oracle表(US7ASCII字符集)时汉字出现乱码?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 11g 没有US7ASCII字符集么?在选择字符集的时候要选择哪一呀?

thinkphp volist遍历oracle数据库时中文出现乱码

oracle用的AMERICAN_AMERICA.us7ascii字符集,但是数据库语句执行下来,中文为乱码。求答案

(Oracle) 在 Snowflake 中转换 us7ascii?

java 从oracl读取数据时候乱码了,原因之一就是数据库所使用的字符编码是merican_America.US7Ascii

oracle 8i, 字符集为US7ASCII,java 取汉字乱码,怎么处理,求高手解答!