我正在尝试将新记录插入到我的AS400表中,其字符串值包含希腊语和英语字符的混合。
表格结构:
CREATE TABLE RAVONLIBT.LAMBDA (
CHRCCS875 CHAR(5) CCSID 875 DEFAULT NULL ,
VARCCS875 VARCHAR(5) CCSID 875 DEFAULT NULL )
C#代码:
private void Retrieve_Click(object sender, EventArgs e)
{
var sql = new StringBuilder();
sql.AppendFormat("SELECT * FROM LAMBDA");
OdbcConnection con = GetConnection(AS400Library.RAVONLIBT, Resources.Username, Resources.Password);
DataTable dt = Retrieve(con, sql.ToString());
textBox1.Text = dt.Rows[0]["CHRCCS875"].ToString();
textBox2.Text = dt.Rows[0]["VARCCS875"].ToString();
}
private void Insert_Click(object sender, EventArgs e)
{
var sql = new StringBuilder();
sql.AppendFormat("INSERT INTO LAMBDA (CHRCCS875,VARCCS875) VALUES ('{0}','{1}'", textBox1.Text, textBox2.Text);
OdbcConnection con = GetConnection(AS400Library.RAVONLIBT, Resources.Username, Resources.Password);
ExecuteNonQuery(con, sql.ToString());
}
private OdbcConnection GetConnection(AS400Library library, string userName, string password)
{
return new OdbcConnection(string.Format("ODBC;DATABASE=QGPL;DSN=AS400-{0};UID={1};PWD={2};ALLOWUNSCHAR=0;", library.ToString(), userName, password));
}
private int ExecuteNonQuery(OdbcConnection connection, string sql)
{
try
{
var command = new OdbcCommand(sql);
command.Connection = connection;
connection.Open();
return command.ExecuteNonQuery();
}
finally
{
connection.Close();
}
}
private DataTable Retrieve(OdbcConnection connection, string sql)
{
var dataTable = new DataTable();
OdbcCommand command = new OdbcCommand(sql);
command.Connection = connection;
OdbcDataAdapter adapter = new OdbcDataAdapter(command);
try
{
connection.Open();
adapter.Fill(dataTable);
}
finally
{
connection.Close();
}
return dataTable;
}
在每条记录的2个字段中插入了相同的字符串。第一条记录的值由copy& amp;使用我的C#应用程序粘贴和第二条记录的值。
我试验了以下内容:
答案 0 :(得分:1)
存储混合语言的最佳方法是在unicode列中。
假设最近发布的IBM i使用NATIONAL CHARACTER
类型
CREATE TABLE RAVONLIBT.LAMBDA (
CHRCCS875 NCHAR(5) DEFAULT NULL ,
VARCCS875 NVARCHAR(5) DEFAULT NULL )
在旧版本中,您可以明确设置使用GRAPHIC
类型和CCSID 1200
CREATE TABLE RAVONLIBT.LAMBDA (
CHRCCS875 GRAPHIC(5) CCSID 1200 DEFAULT NULL ,
VARCCS875 VARGRAPIC(5) CCSID 1200 DEFAULT NULL )
使用任何一种方法,您都可以获得相同的结果,即UTF-16列。
答案 1 :(得分:0)
事实上,正如@jmarkmurphy所说,CCSID 875足以容纳希腊字符。 为了使其通过代码工作,需要在连接字符串中添加以下内容:
UNICODESQL=1
您可以在IBM
找到更多信息使用ODBC连接,连接字符串为:
private OdbcConnection GetConnection(AS400Library library, string userName, string password)
{
return new OdbcConnection(string.Format("ODBC;DATABASE=QGPL;DSN=AS400-{0};UID={1};PWD={2};ALLOWUNSCHAR=0;UNICODESQL=1;", library.ToString(), userName, password));
}