在 .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 类型。
我在检索 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 类型。