今天测试了一下,今天在这里不知写什么就贴了出来,测试环境:
Oracle数据库1:中文操作系统,Oracle10g,字符集编码为ZHS16BGK;
Oracle数据库2:中文操作系统,Oracle10g,字符集编码为ALT32UTF8;
客户端:WinXP中文操作系统。
测试过程用代码说话:
//连Oracle数据库1
//哪种插入方式下,中文部分都正常
private void button3_Click(object sender, EventArgs e) {
using (OracleConnection conn = new OracleConnection()) {
conn.ConnectionString = "Data source=serverdb;User ID=dbuser;Pwd=238173";
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
//删除表
try {
cmd.CommandText = "DROP TABLE A001";
cmd.ExecuteNonQuery();
}
catch {
//可能不存在
}
//创建表
cmd.CommandText = "CREATE TABLE A001(ID NUMBER(1), NAME VARCHAR2(100), NAME2 NVARCHAR2(100))";
cmd.ExecuteNonQuery();
//方式一插入数据
cmd.CommandText = "INSERT INTO A001 VALUES(1, N'中国고려대학교上海', N'中国고려대학교上海')";
cmd.ExecuteNonQuery();
//方式二插入数据
cmd.CommandText = "INSERT INTO A001 VALUES(2, :NAME, :NAME2)";
cmd.Parameters.Add("NAME", OracleType.VarChar);
cmd.Parameters.Add("NAME2", OracleType.NVarChar);
cmd.Parameters[0].Value = "中国고려대학교上海"; //包含有它国语言
cmd.Parameters[1].Value = "中国고려대학교上海";
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
object name;
object name2;
//用数据适配器获取数据
cmd.CommandText = "SELECT NAME, NAME2 FROM A001";
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataTable table = new DataTable();
da.Fill(table);
foreach (DataRow row in table.Rows) {
name = row["NAME"]; //二种方式插入的数据,它国语言部分都显示为乱码
name2 = row["NAME2"]; //用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
}
cmd.Parameters.Clear();
//用ExecuteScalar获取数据
cmd.CommandText = "SELECT NAME FROM A001 WHERE ID = 1";
name = cmd.ExecuteScalar(); //它国语言部分显示为乱码
cmd.CommandText = "SELECT NAME2 FROM A001 WHERE ID = 1";
name2 = cmd.ExecuteScalar(); //它国语言部分显示为乱码
cmd.CommandText = "SELECT NAME FROM A001 WHERE ID = 2";
name = cmd.ExecuteScalar(); //它国语言部分显示为乱码
cmd.CommandText = "SELECT NAME2 FROM A001 WHERE ID = 2";
name2 = cmd.ExecuteScalar(); //它国语言部分显示正常
//用ExecuteReader获取数据
cmd.CommandText = "SELECT NAME, NAME2 FROM A001";
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read()) {
name = reader.GetValue(0); //二种方式插入的数据,它国语言部分都显示为乱码
name2 = reader.GetValue(1); //用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
}
}
}
//连Oracle数据库2
//哪种插入方式下,中文部分都正常
private void button4_Click(object sender, EventArgs e) {
using (OracleConnection conn = new OracleConnection()) {
conn.ConnectionString = "Data source=testdb;User ID=dbuser;Pwd=dcms";
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
//删除表
try {
cmd.CommandText = "DROP TABLE A001";
cmd.ExecuteNonQuery();
}
catch {
//可能不存在
}
//创建表
cmd.CommandText = "CREATE TABLE A001(ID NUMBER(1), NAME VARCHAR2(100), NAME2 NVARCHAR2(100))";
cmd.ExecuteNonQuery();
//方式一插入数据
cmd.CommandText = "INSERT INTO A001 VALUES(1, N'中国고려대학교上海', N'中国고려대학교上海')";
cmd.ExecuteNonQuery();
//方式二插入数据
cmd.CommandText = "INSERT INTO A001 VALUES(2, :NAME, :NAME2)";
cmd.Parameters.Add("NAME", OracleType.VarChar);
cmd.Parameters.Add("NAME2", OracleType.NVarChar);
cmd.Parameters[0].Value = "中国고려대학교上海"; //有它国语言
cmd.Parameters[1].Value = "中国고려대학교上海";
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
object name;
object name2;
//用数据适配器获取数据
cmd.CommandText = "SELECT NAME, NAME2 FROM A001";
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataTable table = new DataTable();
da.Fill(table);
foreach (DataRow row in table.Rows) {
name = row["NAME"]; //用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
name2 = row["NAME2"]; //用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
}
cmd.Parameters.Clear();
//用ExecuteScalar获取数据
cmd.CommandText = "SELECT NAME FROM A001 WHERE ID = 1";
name = cmd.ExecuteScalar(); //它国语言部分显示为乱码
cmd.CommandText = "SELECT NAME2 FROM A001 WHERE ID = 1";
name2 = cmd.ExecuteScalar(); //它国语言部分显示为乱码
cmd.CommandText = "SELECT NAME FROM A001 WHERE ID = 2";
name = cmd.ExecuteScalar(); //它国语言部分显示正常
cmd.CommandText = "SELECT NAME2 FROM A001 WHERE ID = 2";
name2 = cmd.ExecuteScalar(); //它国语言部分显示正常
//用ExecuteReader获取数据
cmd.CommandText = "SELECT NAME, NAME2 FROM A001";
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read()) {
name = reader.GetValue(0); //用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
name2 = reader.GetValue(1); //用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
}
}
}
总结:
入数据方式
数据库字符集为ZHS16GBK编码
数据库字符集为AL32UTF8编码
VARCHAR2
NVARCHAR2
VARCHAR2
NVARCHAR2
直接SQL插入
乱码
乱码
乱码
乱码
SQL带参插入
乱码
正常
正常
正常
说明:当前都是在中文操作系统下测试所得,它国语言版操作系统未知;