o**********a 发帖数: 330 | 1 【 以下文字转载自 DotNet 讨论区 】
发信人: oldmanpushca (oldmanpushcar), 信区: DotNet
标 题: C# DateTime to Oracle Date
发信站: BBS 未名空间站 (Tue Oct 22 23:58:58 2013, 美东)
我的任务是把一个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); | n****f 发帖数: 905 | 2 这个任务可以直接完成, 不用借助 C#。
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/password@db_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')" | s********e 发帖数: 893 | 3 你说的这个情况用sqlldr 是很方便的。
如果必须要用code实现,你先把Datatable里的date输出到一个label看看是不是在写入
oracle以前那个year就乱了。或者某个地方把日期格式化一下。
to_date('" & Product_Date & "', 'mm/dd/yyyy') | o**********a 发帖数: 330 | 4 谢谢回复.sqlldr 应该也可以在code里面call一个可执行文件,然后用sqlldr 弄进去
,但是看同事用的这个bulkcopy 挺方便的。
我debug的时候看了,在OracleBulkCopy之前,在memory table里面(DataTable)数据
是正确的。但是放到数据库里就错了。
fyi..
今天写了个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
【在 s********e 的大作中提到】 : 你说的这个情况用sqlldr 是很方便的。 : 如果必须要用code实现,你先把Datatable里的date输出到一个label看看是不是在写入 : oracle以前那个year就乱了。或者某个地方把日期格式化一下。 : to_date('" & Product_Date & "', 'mm/dd/yyyy')
|
|