avatar
C# DateTime to Oracle Date# DotNet - 窗口里的风景
o*a
1
我的任务是把一个csv file 用c # load 到oracle table 里面
大概步骤是把csv load 到 DataTable里面
然后再用OracleBulkCopy把DataTable load 到oracle table 里面
现在出现一个问题就是有一个column是 Date,每次load到数据库里面的
时候,总是出错,不知道大家有没有类似的经验
例如下面这个例子,在code里面产生一个2013年10月8日,但是插到ora
cle里面之后就变成了10/08/1320。 显然已经在oracle Date的范围内了,
但是还是插进去,点击那个Date column,就会变成乱码,and告诉你已经超出范围
了。
有没有有人做过,给提示一下。下面是code ,多谢了阿!!
DataTable dt = new DataTable();
dt.Columns.Add("Product_Date",typeof(DateTime));
dt.Columns.Add(....);
...
DataRow dr = dt.NewRow();
dr[0] = new DateTime(2013,10,8);
dr[1] = ...;
...
OracleBulkCopy bc = new OracleBulkCopy(myConn);
bc.DestinationTableName = "TableName";
bc.WriteToServer(dt);
avatar
n*f
2
这个任务可以直接完成, 不用借助 C#。
这种方式容许你导入很大(1G,10G。。)的 CSV 文件。
1. 在 Oracle 建立一个表:
CREATE TABLE oldmanpushca.DATE_TEST
(
COL1 VARCHAR2(100 BYTE),
COL_DATE DATE
);
2. 用 NOTEPAD 在 C:\OracleLoader\ 盘建立了一个 CSV 文件:
C:\OracleLoader\DATE_TEST.CSV, 内容如下:
C1R1 TEXT 1, 2013/10/22
C1R2 TEXT 2, 2014/10/22
C1R3 TEXT 3, 2015/10/22
3. 用 NOTEPAD 在 C:\OracleLoader\ 盘建立了一个控制文件:
C:\OracleLoader\Para.CTL , 内容如下:
LOAD DATA
infile 'C:\OracleLoader\DATE_TEST.CSV'
APPEND
INTO TABLE oldmanpushca.DATE_TEST
FIELDS TERMINATED BY ',' optionally enclosed by '"'
TRAILING NULLCOLS
(
COL1,
COL_DATE "TO_DATE(:COL_DATE ,'YYYY-MM-DD')"
)
4. 用 NOTEPAD 在 C:\OracleLoader\ 盘建立了一个执行文件:
C:\OracleLoader\LoadCSV.CMD , 内容如下:
SQLLDR oldmanpushca/[email protected]_tns_name DIRECT=TRUE ERRORS=100000000
CONTROL=C:\OracleLoader\Para.CTL
5. 在 DOS 执行 C:\OracleLoader\LoadCSV.CMD
你会发现你得到预想的数据。
假如你CSV 的日期是: 10-22-2013, 那么在控制文件中就要做相应的修改。
比如: COL_DATE "TO_DATE(:COL_DATE ,'MM-DD-YYYY')"
avatar
o*a
3
多谢回复。
但是我现在想在code里把这个数据插进去。

【在 n****f 的大作中提到】
: 这个任务可以直接完成, 不用借助 C#。
: 这种方式容许你导入很大(1G,10G。。)的 CSV 文件。
: 1. 在 Oracle 建立一个表:
: CREATE TABLE oldmanpushca.DATE_TEST
: (
: COL1 VARCHAR2(100 BYTE),
: COL_DATE DATE
: );
: 2. 用 NOTEPAD 在 C:\OracleLoader\ 盘建立了一个 CSV 文件:
: C:\OracleLoader\DATE_TEST.CSV, 内容如下:

avatar
n*f
4
那你得事先转换成 ORACLE 默认日期格式。-- 这是不容易的。因为很多data driver
的格式不一样。 你要自己一次次尝试。
最简单的办法是在 ORACLE table 里面建立一个新 COL, 比如叫 CHAR_DATE , TYPE
是字符 VARCHAR2(10)。
把日期原封不动地导入, 比如 “2013-10-8”
全部导入之后, 再在 Oracle 里面把字符, 用 TO_DATE() 转换到你原来的 My_
DATE 当中。

【在 o**********a 的大作中提到】
: 多谢回复。
: 但是我现在想在code里把这个数据插进去。

avatar
o*a
5
今天写了个test的code,在我同事的机器上run就能正确地把日期插入到oracle table
里面的,但是在我的机器上run,还是出现同样的问题,就是本来应该是 10/18/2013,
但是插进去后变成10/18/1320。
我和同事都是用的同一个version of ODP for .NET. 我们俩的电脑也一样,都是win7
,vs2010。
真是奇怪。
还有一个比较有意思的就是,我们老印推荐的方法 在code里面生产DateTime的时候这
么写
new DateTime(1320,10,18),果然生效,插入后就变成正确地date在oracle里面。
这个会不会和我c盘装的oracle client 有关系,我好像装了两个oracle client

TYPE

【在 n****f 的大作中提到】
: 那你得事先转换成 ORACLE 默认日期格式。-- 这是不容易的。因为很多data driver
: 的格式不一样。 你要自己一次次尝试。
: 最简单的办法是在 ORACLE table 里面建立一个新 COL, 比如叫 CHAR_DATE , TYPE
: 是字符 VARCHAR2(10)。
: 把日期原封不动地导入, 比如 “2013-10-8”
: 全部导入之后, 再在 Oracle 里面把字符, 用 TO_DATE() 转换到你原来的 My_
: DATE 当中。

avatar
n*f
6
2 Clients is OK. Check and compare the Oracle DB Connection String.
As I told you, different connection string(driver) will cause different
results.
avatar
o*a
7
问题肯定是我自己机器的问题,
不知道谁遇到过这样的问题。再啰嗦一遍,如果谁遇到类似情况请帮个忙
DataTable dt = new DataTable();
dt.Columns.Add("Product_Date",typeof(DateTime));
dt.Columns.Add(....);
...
DataRow dr = dt.NewRow();
dr[0] = new DateTime(2013,10,8);
dr[1] = ...;
...
OracleBulkCopy bc = new OracleBulkCopy(myConn);
bc.DestinationTableName = "TableName";
bc.WriteToServer(dt);
在同样的code,饮用同样的库,在我的电脑上run完后,插入到oracle里面就变成了 10
/08/1320,而在其他同样的电脑和server上run都没有问题
如果在我的电脑上,把 dr[0] = new DateTime(1320,10,8); 这样插到oracle里面就变
成10/08/2013 了。

【在 n****f 的大作中提到】
: 2 Clients is OK. Check and compare the Oracle DB Connection String.
: As I told you, different connection string(driver) will cause different
: results.

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。