C# 如何在使用OracleDataReader.GetFieldType(i)时在整数和小数字段之间进行定义

C# 如何在使用OracleDataReader.GetFieldType(i)时在整数和小数字段之间进行定义,c#,C#,我使用OracleDataReader.GetFieldType(I)获取存储过程返回的记录集字段,以便生成可用于调用此SP的CS类文件(我需要为SP返回的每个字段定义一个类属性-因此我需要字段的数据类型) 问题是我无法确定字段类型是整数还是十进制,因为GetFieldType(I)返回System.decimal如果字段类型是Number,那么我无法确定字段是整数还是双/十进制值 下面是我用来获取SP返回的字段的代码: #region OpenDBConnection oConnection.

我使用
OracleDataReader.GetFieldType(I)
获取存储过程返回的记录集字段,以便生成可用于调用此SP的CS类文件(我需要为SP返回的每个字段定义一个类属性-因此我需要字段的数据类型)

问题是我无法确定字段类型是整数还是十进制,因为
GetFieldType(I)
返回
System.decimal
如果字段类型是
Number
,那么我无法确定字段是整数还是双/十进制值

下面是我用来获取SP返回的字段的代码:

#region OpenDBConnection
oConnection.ConnectionString = sDBConnectionString;
OracleCommand oCommand;
oConnection.Open();
#endregion

#region GetTheFieldsOfTheGetProcedure
oCommand = new OracleCommand("SPName", oConnection);
oCommand.CommandType = System.Data.CommandType.StoredProcedure;
foreach (Parameter oParam in oliGetProcParams)
{
    OracleParameter oOracleParam = new OracleParameter();
    oOracleParam.ParameterName = oParam.ParamName;
    oOracleParam.Value = DBNull.Value;
    oOracleParam.Direction = oParam.ParamDirection;
    oOracleParam.OracleType = oParam.ParamDataType;
    oCommand.Parameters.Add(oOracleParam);
}

OracleParameter oCVParam = new OracleParameter("cv_1", OracleType.Cursor);
oCVParam.Direction = System.Data.ParameterDirection.Output;
oCommand.Parameters.Add(oCVParam);

OracleDataReader oReader = oCommand.ExecuteReader();                

if (oReader != null)
{
    for (int i = 0; i < oReader.FieldCount; i++)
    {
        CustomField oField = new CustomField();
        oField.Name = oReader.GetName(i);
        oField.DataType = oReader.GetFieldType(i).ToString();
        oliFields.Add(oField);
    }
}
#endregion

oCommand.Dispose();
oReader.Dispose();
#区域OpenDBConnection
oConnection.ConnectionString=sDBConnectionString;
OracleCommand命令;
oConnection.Open();
#端区
#区域获取领域软件霸权过程
oCommand=新的OracleCommand(“SPName”,ocConnection);
oCommand.CommandType=System.Data.CommandType.StoredProcess;
foreach(oliGetProcParams中的参数oParam)
{
OracleParameter oOracleParam=新的OracleParameter();
oOracleParam.ParameterName=oParam.ParamName;
oOracleParam.Value=DBNull.Value;
oOracleParam.Direction=oParam.ParamDirection;
oOracleParam.OracleType=oParam.ParamDataType;
oCommand.Parameters.Add(oOracleParam);
}
OracleParameter oCVParam=新的OracleParameter(“cv_1”,OracleType.Cursor);
oCVParam.Direction=System.Data.ParameterDirection.Output;
oCommand.Parameters.Add(oCVParam);
OracleDataReader oReader=oCommand.ExecuteReader();
if(oReader!=null)
{
for(int i=0;i
我认为您可以在try catch中将值强制转换为typeof int,如果它不是int,则应该是double


这是我将尝试的方法。

您可以使用
DbDataReader.GetSchemaTable()
获取元数据
DataTable
,其中包含有关类型的更多信息,包括精度和比例

架构表在数据读取器中的每一列都有一行,以及
ColumnName
NumericPrecision
/
NumericScale
等列。因此,您可以一行接一行地浏览,并获取所需的所有元数据


但是,请注意,您仍然需要将值读取为
十进制
——提供者将以
十进制
的形式将其提供给您。不过,您应该能够手动将这些映射到更合适的类型。不过,默认数字精度在Oracle上有点烦人,因此很可能您需要坚持使用
decimal
number(20,0)
对于
long
来说太大了,即使它是整数)。

这很好,但有一点,如果我只需要将变量定义为int/double,我应该如何根据精度和比例设置字段类型(我的意思是基于什么条件)?@KarimAG最接近
int
的是
number(9)
,或者更好的是
binary\u integer
double
是一个完全不同的概念——它是一个二进制数,而不是十进制数;oracle上的正确类型是
binary\u double
。如果您习惯于使用
数字
,我就不会为它费心了-坚持使用
十进制
s,它们的行为与
数字
相同。首先,感谢您的有用回答,最后一个问题,我使用T4生成CS文件,问题是,
DataRow.Field
方法是一种扩展方法,您不能在T4模板中使用扩展方法,您是否有其他方法可以提供相同的功能?@KarimAG真的吗?我不明白为什么它会被禁用。。。您不是缺少正确的名称空间(
System.Data
)吗?无论如何,您可以手动调用该方法(
System.Data.DataRowExtensions.Field``1
),或者使用旧方法获取值(
row[columnNameOrIndex]
)。我的错误是,我的代码缺少System.Data.DataSetExtensions的导入标记,非常感谢@Luaa。这不会起作用,因为我处理的是FieldType,而不是该行的值,因此,铸造和检查铸造是否有效没有任何价值。