C#:Oracle 数据类型与 OracleDbType 的等效性
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1583150/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C#: Oracle Data Type Equivalence with OracleDbType
提问by Partial
Situation:
情况:
I am creating an app in C# that uses Oracle.DataAccess.Client (11g) to do certain operations on a Oracle database with stored procedures. I am aware that there is a certain enum (OracleDbType) that contains the Oracle data types, but I am not sure which one to use for certain types.
我正在 C# 中创建一个应用程序,它使用 Oracle.DataAccess.Client (11g) 对带有存储过程的 Oracle 数据库执行某些操作。我知道有一个包含 Oracle 数据类型的枚举 (OracleDbType),但我不确定对于某些类型使用哪一个。
Questions:
问题:
What is the equivalent Oracle PL/SQL data typefor each enumerated type in the OracleDbType enumeration?
There are three types of integer
(Int16, Int32, Int64) in the OracleDbType... how to know which one to use or are they all
suppose to work?
OracleDbType 枚举中每个枚举类型的等效Oracle PL/SQL 数据类型是 什么?
OracleDbType 中有三种类型的整数(Int16、Int32、Int64)......如何知道使用哪一种或者它们都
可以工作?
采纳答案by APC
The values of the OracleDbType Enumeration are defined in the documentation. Read the ODP for .NET Developer's Guide.
OracleDbType 枚举的值在文档中定义。阅读ODP for .NET 开发人员指南。
With regards to choosing between Int16, Int32 and Int64, they are all supposed to work. Choose the one which matches the expected size of your .Net variable: Int16 for values between -32768 and 32767, Int32 for values between -2147483648 and 2147483647, and Int64 for anything larger. There appear to be some funnies relating to converting Ints and PL/SQL data types. Check this blog post by Mark Williams.
关于在 Int16、Int32 和 Int64 之间进行选择,它们都应该可以工作。选择与您的 .Net 变量的预期大小匹配的一个: Int16 用于 -32768 和 32767 之间的值,Int32 用于 -2147483648 和 2147483647 之间的值,以及 Int64 用于更大的值。似乎有一些与转换 Int 和 PL/SQL 数据类型有关的有趣之处。查看Mark Williams 的这篇博文。
回答by Charles Bretana
Here's a method to convert C# types to the most common OracleDbTypes
这是将 C# 类型转换为最常见的 OracleDbTypes 的方法
private static OracleDbType GetOracleDbType(object o)
{
if (o is string) return OracleDbType.Varchar2;
if (o is DateTime) return OracleDbType.Date;
if (o is Int64) return OracleDbType.Int64;
if (o is Int32) return OracleDbType.Int32;
if (o is Int16) return OracleDbType.Int16;
if (o is sbyte) return OracleDbType.Byte;
if (o is byte) return OracleDbType.Int16; -- <== unverified
if (o is decimal) return OracleDbType.Decimal;
if (o is float) return OracleDbType.Single;
if (o is double) return OracleDbType.Double;
if (o is byte[]) return OracleDbType.Blob;
return OracleDbType.Varchar2;
}
Also, for very large character data values, you may want to use OracleDbType.Clob
.
此外,对于非常大的字符数据值,您可能需要使用OracleDbType.Clob
.
回答by Mac
Check APC's linksout, they are what you are looking for : the mapping is quite straightforward according to the name of the enumeration.
检查APC 的链接,它们就是您要查找的内容:根据枚举的名称,映射非常简单。
But as you began to notice, there is something tricky about integers. Here is my mapping :
但是正如您开始注意到的那样,整数有些棘手。这是我的映射:
Int16
:NUMBER(5)
.Int32
:NUMBER(10)
.Int64
:NUMBER(19)
.
Int16
:NUMBER(5)
。Int32
:NUMBER(10)
。Int64
:NUMBER(19)
。
The thing is that if you call GetInt64
on a NUMBER(38)
column, you will get an exception even if the value is in the correct range...
问题是,如果您调用GetInt64
一NUMBER(38)
列,即使该值在正确的范围内,您也会收到异常...
回答by Carl Prothman
NUMBER(1,0) => Boolean
NUMBER(1,0) => 布尔值
NUMBER(5,0) => Int16.MaxValue == 32767
NUMBER(5,0) => Int16.MaxValue == 32767
NUMBER(10,0) => Int32.MaxValue == 2,147,483,647
NUMBER(10,0) => Int32.MaxValue == 2,147,483,647
NUMBER(19,0) => Int64.MaxValue == 9,223,372,036,854,775,807
NUMBER(19,0) => Int64.MaxValue == 9,223,372,036,854,775,807
NUMBER(19,0) => long.MaxValue == 9,223,372,036,854,775,807
NUMBER(19,0) => long.MaxValue == 9,223,372,036,854,775,807
回答by Sterling Diaz
For those who wants to know the equivalent of de floating points:
对于那些想知道 de 浮点数的等价物的人:
Decimal Oracle NUMBER type
Double 8-byte FLOAT type
Decimal is the way to go if you used Number in oracle.
如果您在 oracle 中使用 Number,则十进制是要走的路。
As APC pointed: https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm
正如 APC 指出的那样:https: //docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm