最近有个项目组安装数据库的时候将字符集设置成了【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
)
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
)
解决方案 »
- 大牛求救,各位求救哦
- 窗体关闭了,但端口连接还是被占用,如何解决?[内详]
- C#怎样通过输入系统管理员的密码提高权限
- 请教:Clips语言与C#?急~
- 线程问题,该如何处理,大家帮忙看下。
- 看不懂这句
- C#里多个窗体怎么共享某一个窗体定义的菜单?
- vs.net一般都是5张CD,在安装时是不是要全部安装呢?
- 一个简单的问题,来拿分阿
- c#在wiform中加载百度地图,点击百度地图上的标注点(红色的点),new出一个新的窗体,怎么解决
- 通过kernel32.dll调用动态库调时第一个接口函数能成功,第二个时“无法加载 DLL“kernel32.dll”
- 如何在一个线程结束时,调用另外一个函数?
或者说SYS.XMLTYPE这个类型是被序列化了的 需要反序列化?
好神奇的字符集,我将XML先转字符集什么的都不行,到数据库里面中文还是变成问号
打算用dataset试试,不过貌似用dataset处理XMLTYPE也很麻烦