c# oracle【us7ascii】 sys.xmltype字段 中文乱码该如何解决
最近有个项目组安装数据库的时候将字符集设置成了【SIMPLIFIED CHINESE_CHINA.US7ASCII】,服务端客户端一致,本身这个字符集存储中文是没问题的,可是在我们的系统程序使用OracleDataReader读取和写入的时候,中文部分全成了“?”。有哪位大侠帮帮忙指点一下,谢谢了。
这几天在晚上找了些资料,自己也研究了下,已经解决了一些事情:
1、字符串类型的字段,类型一定要用NVARCHAR,不能用varchar
2、相比较之下,使用DataSet访问数据时,一切正常,但是DataReader.....
就是这个SYS.XMLTYPE字段实在是不知道怎么解决了,客户要求 数据库字符集一定要设置为 US7ASCII
附上我的代码:
string connectionString = "Data Source =testascii;Persist Security Info=True;User ID=common;Password=common";
string strProperty = @"<root>中国</root>";
string strSql = @"insert into d_test values(:nvar,SYS.XMLType(:xml))";
using (OracleConnection connection = new OracleConnection(connectionString))
{
connection.Open();
OracleTransaction tr = null;
if (System.Transactions.Transaction.Current == null) tr = connection.BeginTransaction();
using (OracleLob clob = OracleHelper.CreateTempLob(connection, tr, OracleType.Clob, strProperty))
{
OracleParameter[] commandParameters = new OracleParameter[2];
commandParameters[0] = new OracleParameter("nvar", OracleType.NVarChar);
commandParameters[0].Value = DateTime.Now.ToLongDateString();
commandParameters[1] = new OracleParameter("xml", OracleType.Clob);
commandParameters[1].Value = clob;
int count = OracleHelper.ExecuteNonQuery(connection, tr, CommandType.Text, strSql, commandParameters);
//OracleCommand cmd = new OracleCommand(strSql,connection);
//cmd.Transaction = tr;
//OracleParameter p1 = new OracleParameter("nvar", OracleType.NVarChar);
//OracleParameter p2 = new OracleParameter("xml", OracleType.Clob);
//p1.Value = DateTime.Now.ToLongDateString();
//p2.Value = clob;
//cmd.Parameters.Add(p1);
//cmd.Parameters.Add(p2);
//int count = cmd.ExecuteNonQuery();
if (tr != null) tr.Commit();
connection.Close();
if (count >= 1)
{
MessageBox.Show("ok");
}
else
{
MessageBox.Show("shit");
}
}
}
d_test表结构:
create table D_TEST
(
NVAR NVARCHAR2(100),
XMLTYPE SYS.XMLTYPE
)