【问题标题】:A character to numeric conversion process failed字符到数字的转换过程失败
【发布时间】:2012-06-14 09:11:49
【问题描述】:

当我尝试使用带有 informix 的参数化查询时,我遇到了以下异常。

A character to numeric conversion process failed

                    StringBuilder sQuery = new StringBuilder();
                    Dictionary<string, string> paramList = new Dictionary<string, string>();
                    cmdTxt.Append(" UPDATE userwidgetto SET widget_color = ?, widget_column = ?, widget_order = ?,widget_state = ?,widget_type = ? ");
                    cmdTxt.Append(" WHERE process_id = ? AND emp_num = ? ");

                    paramList.Add("process_id", Process_id.ToString());
                    paramList.Add("emp_num", Emp_num.ToString());
                    paramList.Add("widget_color", Widget_color.TrimEnd());
                    paramList.Add("widget_column", Widget_column.ToString().TrimEnd());
                    paramList.Add("widget_order", Widget_order.ToString());
                    paramList.Add("widget_state", Widget_state.ToString());
                    paramList.Add("widget_type", Widget_type.ToString());
                    affectedRow = DAL_Helper.Execute_NonQuery(cmdTxt.ToString(), CommandType.Text, paramList);

public int Execute_NonQuery(string cmdText, CommandType cmdType, Dictionary<string, string> Param_arr)
            {
                Open_Connection();
                int return_val = -1;
                command.CommandText = cmdText;
                command.CommandType = cmdType;
                command.Transaction = current_trans;
                command.Parameters.Clear();
                if (Param_arr != null)
                {
                    foreach (KeyValuePair<string, string> parameter in Param_arr)
                    {
                        param = command.CreateParameter();
                        param.ParameterName = parameter.Key.ToString();
                        if (parameter.Value.ToString() == "Null" || string.IsNullOrEmpty(parameter.Value))
                            param.Value = DBNull.Value;
                        else
                            param.Value = parameter.Value.ToString();
                        command.Parameters.Add(param);
                    }
                }
                try
                {
                    return_val = command.ExecuteNonQuery();//means no error message //OK                
                }
                catch (IfxException ifxEx)// Handle IBM.data.informix : mostly catched
                {
                    return_val = ifxEx.Errors[0].NativeError;
                }
                catch (Exception Ex)
                {
                    ErrMapping.WriteLog("\r\n" + Ex.Message);
                    return_val = ExCodeConst;
                }
                finally
                {
                    Close_Connection();
                }
                return return_val;
            }

【问题讨论】:

    标签: c# asp.net sql informix parameterized-query


    【解决方案1】:

    我想您正在使用 OleDb 客户端。 在这种情况下,参数应该以与命令字符串占位符相同的位置顺序插入 (?)

    cmdTxt.Append(" UPDATE userwidgetto SET widget_color = ?, widget_column = ?, widget_order = ?,widget_state = ?,widget_type = ? ");
    cmdTxt.Append(" WHERE process_id = ? AND emp_num = ? ");
    paramList.Add("widget_color", Widget_color.TrimEnd());
    paramList.Add("widget_column", Widget_column.ToString().TrimEnd());
    paramList.Add("widget_order", Widget_order.ToString());
    paramList.Add("widget_state", Widget_state.ToString());
    paramList.Add("widget_type", Widget_type.ToString()); 
    paramList.Add("process_id", Process_id.ToString());
    paramList.Add("emp_num", Emp_num.ToString());
    affectedRow = DAL_Helper.Execute_NonQuery(cmdTxt.ToString(), CommandType.Text, paramList); 
    

    Dictionary paramList 也强制传递给 DAL_Helper 的每个值都为字符串类型。
    而且,我认为,从给出的参数名称来看,情况并非如此(process_id 不是数据库表中的字符串吗?)。
    正如评论中已经建议的那样,您应该将 paramList 更改为 Dictionary ,然后仅在适当的地方添加带有字符串转换的参数(意味着表列的数据类型是字符串类型) .

    【讨论】:

    • 太好了,这解决了我的问题..真的很感谢,但我不明白最后一条评论我已经有一本字典如何允许接受所有数据类型而无需转换 tostring()
    • 你能给我一个简单的例子吗?
    • 如果你声明Dictionary&lt;string, object&gt; paramList,那么你可以写paramList.Add("process_id", Process_id);。您的 DAL_Helper 类,当将此参数添加到 OleDbParameterCollection 以更新您的表时,将看到您有一个整数类型的对象并将一个整数传递给更新您的表的命令。
    • 如果您还可以显示 DAL_Helper.ExecuteNonQuery 的代码将非常有用
    • 真的很奇怪,每个参数都转换成字符串。我不了解 Informix,并且 OleDb 驱动程序曾经与数据库后端一起使用,但我认为您在这里遇到了很大的问题。您的表中是否只有字符串列? (只是说清楚事情,这将是一个巨大的错误)
    猜你喜欢
    • 1970-01-01
    • 2016-01-02
    • 2020-06-04
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多