在 .NET 上使用 Informix 函数检索数据集时出错

Error retrieving dataset with Informix function on .NET

我在检索 Informix 上并从 VB .NET 代码调用的函数的结果时遇到问题。

这是堆栈跟踪:

   at IBM.Data.Informix.IfxDateTime.ValidateRange()
   at IBM.Data.Informix.IfxDataReader.internalGetIfxDateTime(Int32 i)
   at IBM.Data.Informix.IfxDataReader.GetValue(Int32 column, TypeMap typeMap)
   at IBM.Data.Informix.IfxDataReader.GetValue(Int32 i)
   at IBM.Data.Informix.IfxDataReader.GetValues(Object[] values)
   at System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values)
   at System.Data.ProviderBase.SchemaMapping.LoadDataRow()
   at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
   at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
   at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   at ServicesDAL.Repositories.RepositorioBase.GetDatatableFromCommand(String connectionString, String commandText, List`1 parameters, CommandType commandType, String& errorMessage)

知道为什么会这样吗?

当我从 sql 客户端执行函数时,一切正常并显示所有结果。

这是代码:

internal static DataTable GetDatatableFromCommand(string connectionString, string commandText, List<ParameterObject> parameters, CommandType commandType, ref string errorMessage)
        {

            DataTable dt = null;
            errorMessage = null;
            IfxConnection connection = null;
            try
            {
                // Conecto con la base de datos
                connection = ConnectToDatabase(connectionString, ref errorMessage);

                // Si es distinto de null y no hay errores entonces se conecto correctamente
                if (connection != null && string.IsNullOrWhiteSpace(errorMessage))
                {
                    IfxCommand cmd = connection.CreateCommand();
                    cmd.CommandText = commandText;
                    cmd.CommandType = commandType;

                    if (parameters != null)
                    {
                        IfxParameter parameter = null;
                        foreach (ParameterObject parObj in parameters)
                        {
                            parameter = new IfxParameter(parObj.Orden, parObj.Tipo);
                            parameter.Value = parObj.Valor;
                            cmd.Parameters.Add(parameter);
                        }
                    }

                    // Antes de ejecutar la llamada a la base de datos cambio el currentculture
                    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("es-ES");

                    // Creo un adaptador que le paso el comando y ya el lo parsea con el dataTable
                    IfxDataAdapter dataAdapter = new IfxDataAdapter(cmd);
                    dt = new DataTable();
                    dataAdapter.Fill(dt);
                }
            }
            catch (Exception ex)
            {
                errorMessage = ex.Message;
            }
            finally
            {
                // Cierro la conexion siempre despues de sacar los datos
                if (connection != null)
                {
                    connection.Close();
                    connection = null;
                }
            }
            return dt;
        }

更新:我可以在到达 .net 程序之前 格式化日期 吗?我的意思是,在 informix 函数中格式化日期。

由于您正在填充空白数据表,因此这是 informix ADO.NET 提供程序中的错误或限制。所以你需要完全按照你建议的方式解决这个问题:

Could I format the date before it reaches the .net program? I mean, format the date in the informix function.

是的。使用调用函数的 Informix SQL 编写查询,将数据类型转换为 ADO.NET 提供程序可以处理的类型。字符串是这里的后备,您稍后可以自己将它们转换为 .NET 类型。