情况:
我正在用Oracle创建一个应用程序,它使用Oracle.DataAccess.Client (11g)在带有存储过程的C#数据库上执行某些操作。我知道有一个特定的枚举(OracleDbType)包含Oracle数据类型,但我不确定将哪个枚举用于某些类型。
问题:
对于
(Int16,Int32,Int64)在OracleDbType中...如何知道要使用哪一个,或者它们都是
假设可以工作?
发布于 2009-10-17 22:40:44
文档中定义了OracleDbType枚举的值。阅读the ODP for .NET Developer's Guide。
至于在Int16、Int32和Int64之间进行选择,它们都应该是有效的。选择与.Net变量的预期大小匹配的值: Int16表示-32768到32767之间的值,Int32表示-2147483648到2147483647之间的值,Int64表示更大的值。似乎有一些关于转换Int和PL/SQL数据类型的有趣之处。检查this blog post by Mark Williams。
尾部
2021年的问候。这篇文章刚刚获得好评,所以想必搜索者仍然在寻找它,并发现它是有用的。但请注意,已经有十多年的历史了。因此,它提供的建议可能与较新版本的ODP无关,特别是关于不寻常的行为。请不要在没有自己验证的情况下遵循建议。(这是一般的建议,适用于您在Internet上读到的任何内容,而不仅仅是软件开发!)
Here is the pertinent link for Oracle 21c ODP documentation。
发布于 2009-10-17 21:00:19
下面是一种将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;
}
此外,对于非常大的字符数据值,您可能希望使用OracleDbType.Clob
。
发布于 2009-10-19 08:15:55
查看APC's links,它们就是您正在寻找的:根据枚举的名称,映射非常简单。
但是,正如您开始注意到的,整数有一些微妙之处。下面是我的映射:
Int16
:NUMBER(5)
.Int32
:NUMBER(10)
.Int64
:NUMBER(19)
.问题是,如果在NUMBER(38)
列上调用GetInt64
,即使值在正确的范围内,也会出现异常……
https://stackoverflow.com/questions/1583150
复制相似问题