翻译过程中的非精确字符转换

6

在尝试验证用户时,我经常遇到以下错误:

ERROR [HY000] [Informix .NET provider]Inexact character conversion during translation.

 public static int IsValidPortalUser(string p_u, string p_p)
        {
            int ret = 0;
            using (IfxConnection conn = new IfxConnection(connectionString))
            {
                IfxCommand DBCmd = new IfxCommand();
                String p = My_Decryption_2(p_p);
                try
                {
                    if (conn.State == ConnectionState.Closed)
                        conn.Open();
                    DBCmd = new IfxCommand();
                    DBCmd.Connection = conn;
                    DBCmd.CommandText = "SELECT nvl(emp_num,0) FROM emp_mas_queue WHERE username = ? AND DECRYPT_CHAR(password, 'XXXXXX') = ? ";
                    DBCmd.Parameters.Add("user_name", p_u);
                    DBCmd.Parameters.Add("password", p);
                    using (IfxDataReader dataReader = DBCmd.ExecuteReader())
                    {
                        if (dataReader.Read())
                        {
                            if (dataReader[0] != null && !string.IsNullOrEmpty(dataReader[0].ToString()))
                            {
                                ret = int.Parse(dataReader[0].ToString());
                            }
                        }
                        dataReader.Close();

                    }
                }
                catch (ThreadAbortException e)
                {

                }
                catch (ApplicationException e)
                {

                }
                conn.Close();

                return ret;
            }
        }

1
你的Informix数据库运行在什么样的系统上? - user957902
你看过这个链接吗?http://www-01.ibm.com/support/docview.wss?uid=swg1IV03642 我认为问题在于用户的名称或密码中有一些字符会破坏Informix驱动程序。解决方案可以是:限制可接受的字符,或者将用户名和/或密码存储在中性格式(例如base64)中。 - rene
你能告诉我chars在它们的名称中是什么意思吗? - Anyname Donotcare
值得注意的是,在您的数据库中拥有“可解密”的密码也是一个非常糟糕的想法。 - Jon Skeet
1
你的.NET客户端使用哪个区域设置(CLIENT_LOCALE的设置是什么)?你的数据库使用哪个区域设置?两个区域设置很可能使用不同的字符集,并且它们之间没有1:1的转换,这条消息与此有关。Informix服务器是否在与你的.NET客户端相同的机器上?它是否在Unix系统上运行? - Jonathan Leffler
显示剩余4条评论
2个回答

3
我认为这可能是编码问题。

我找到了这篇文章(通过谷歌翻译翻译)

链接

通常是由于人们从具有不同编码的源复制+粘贴其详细信息引起的。在处理它们之前,请将字符串转换为您正在使用的任何代码页。


我认为你指的是编码,而不是代码页。感谢你通过复制/粘贴引导我朝着正确的方向前进。我将文本直接从网页复制到Visual Studio中,结果出现了错误。这里有一个链接,介绍如何使用正则表达式删除无效字符:https://dev59.com/o2Ei5IYBdhLWcg3w2fUm#41149225 - goku_da_master

2
由于这是 stackoverflow 中唯一提到此错误的地方,我想补充一下:我通过在连接字符串级别指定 DB_LOCALE 和 CLIENT_LOCALE 来解决了类似的问题,并确保两者相同并且与数据库 DB_LOCALE 相对应。
修改环境变量无效。
不得不说,我的系统是 Windows 10,客户端版本为 clientsdk.4.10.TC6DE.WIN。

请问您能否编写连接字符串? - Anyname Donotcare
1
大致上是这样的:new PDO("informix:host=host.domain.com; service=9800; database=common_db; server=ids_server; protocol=onsoctcp; EnableScrollableCursors=1;DB_CLIENT=us_en.819;DB_LOCALE=us_en.819", "testuser", "tespass"); - Stéphane Gerber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接