将包含C#中英语和希腊字符混合的字符串插入AS400表

时间:2017-11-09 15:15:02

标签: c# sql winforms unicode ibm-midrange

我正在尝试将新记录插入到我的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;
    }

AS400表记录 enter image description here

在每条记录的2个字段中插入了相同的字符串。第一条记录的值由copy& amp;使用我的C#应用​​程序粘贴和第二条记录的值。

我试验了以下内容:

  1. 从lambda可读的第一条记录中读取数据库中的值。我已将这些值存储在textbox1和textbox2中。我能很好地看到lambda。
  2. enter image description here

    1. 我使用textbox1和texbox2中出现的值(从第一步开始)向数据库添加了一条新记录,我发现这些值未正确保存(请查看第二条记录)。
    2. enter image description here

      显然,将第二条记录检索到textbox1和textbox2并不能正确显示lambda。

      我的问题是:如何使用C#应用程序在AS400表中保存希腊语和英语字符的混合。 我是否需要以特定格式定义表中的列? 我是否需要使用其他提供程序保存到数据库? 我是否需要从C#应用程序中检测lambda字符并以不同的方式将其保存到数据库中?

2 个答案:

答案 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));
}