【发布时间】:2018-04-22 15:41:02
【问题描述】:
我正在尝试在我的 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 个字段中。第一条记录的值是通过复制和粘贴插入的,第二条记录的值是使用我的 C# 应用程序插入的。
我做了以下实验:
- 从 lambda 可读的第一条记录中读取数据库中的值。我已将这些值存储在 textbox1 和 textbox2 中。我可以很好地看到 lambda。
- 我使用 textbox1 和 texbox2 中出现的值(从第一步开始)向数据库添加了一条新记录,我发现这些值没有正确保存(查看第二条记录)。
显然,将第二条记录检索到 textbox1 和 textbox2 并不能正确显示 lambda。
我的问题是:如何使用 C# 应用程序在 AS400 表中保存希腊语和英语字符的混合体。 我需要以某种格式定义表中的列吗? 我需要使用不同的提供程序来保存到数据库吗? 我是否需要从我的 C# 应用程序中检测 lambda 字符并以不同的方式将其保存到数据库中?
【问题讨论】:
-
显然 CCSID 875 足以容纳您想要的字符,因为它们在第一行。我想知道 ODBC 连接,它的字符集。另外,您的 Windows 应用程序使用什么字符集?问题可能是应用程序字符集与 CCSID 875 之间的转换问题。
标签: c# sql winforms unicode ibm-midrange