今天测试了一下,今天在这里不知写什么就贴了出来,测试环境:
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带参插入 | 乱码 | 正常 | 正常 | 正常 |
说明:
当前都是在中文操作系统下测试所得,它国语言版操作系统未知;