【问题标题】:Inserting to an AS400 table a string containing a mixture of English and Greek characters from C#将包含来自 C# 的英语和希腊字符混合的字符串插入到 AS400 表中
【发布时间】: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;
    }

AS400 表记录

相同的字符串被插入到每条记录的 2 个字段中。第一条记录的值是通过复制和粘贴插入的,第二条记录的值是使用我的 C# 应用程序插入的。

我做了以下实验:

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

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

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

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

【问题讨论】:

  • 显然 CCSID 875 足以容纳您想要的字符,因为它们在第一行。我想知道 ODBC 连接,它的字符集。另外,您的 Windows 应用程序使用什么字符集?问题可能是应用程序字符集与 CCSID 875 之间的转换问题。

标签: c# sql winforms unicode ibm-midrange


【解决方案1】:

存储多种语言的最佳方式是在 unicode 列中。

假设最近发布的 IBM 我使用 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 列。

【讨论】:

    【解决方案2】:

    确实,正如@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));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2013-08-14
      • 2021-09-18
      • 2012-05-16
      • 2019-05-10
      • 2018-03-12
      相关资源
      最近更新 更多