Ошибка при получении набора данных с помощью функции Informix в .NET - PullRequest
0 голосов
/ 25 января 2019

У меня проблемы с получением результата функции, которая находится в 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.

1 Ответ

0 голосов
/ 28 января 2019

Поскольку вы заполняете пустую DataTable, это ошибка или ограничение в провайдере informix ADO.NET. Поэтому вам нужно обойти это так, как вы предлагаете:

Могу ли я отформатировать дату до того, как она достигнет программы .net? Я имею в виду, форматировать дату в функции informix.

Да. Напишите запрос, используя Informix SQL, который вызывает функцию, преобразует типы данных во что-то, что может обработать поставщик ADO.NET. Строки являются запасным вариантом, и вы можете позже сами преобразовать их в типы .NET.

...