今天測試了一下,今天在這裏不知寫什麼就貼了出來,測試環境:
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帶參插入 |
亂碼 |
正常 |
正常 |
正常 |
說明:
當前都是在中文操作系統下測試所得,它國語言版操作系統未知;