2013-03-14 4 views
2

EF4와 DB2 LUW 및 iSeries를 사용하는 .Net 어플리케이션이 있습니다..Net에서 iSeries DATE/TIME/TIMESTAMP 컬럼을 갱신하십시오.

DB2에서 명령을 실행할 때 원본 명령을 새로운 iDB2Command에 복제하고 매개 변수를 복사 한 다음 실행합니다. 우리가 DATE 칸에 올 때까지 모두 잘 작동합니다. 이 시점에서 AS400 또는 드라이버는 아래로 떨어지는 것처럼 보입니다. DbTypes.DateTime이고 DateTime 개체가 있지만 DATE이라는 매개 변수를 가져옵니다.

반환 된 오류 (LUW)는 다음과 같습니다. AS400 (v6r1m0)이 코드는 다음과 같이 보입니다

ERROR [22008] [IBM] CLI0114E Datetime field overflow. SQLSTATE=22008

약간 다른 표현을 반환합니다 (완전히 무관 iSeries의/DB2-LUW이다) 그래서

// all generic System.Data classes, no iDB2Connection datatype. The driver isn't even 
// installed on dev/build machines at this point. We rely on .Net reading the connection 
// string from App.config to create the proper DB Driver (db2-luw or iSeries) 

DbConnection c = ... get connection from somewhere... 
DbCommand cmd = c.CreateCommand(); 

var p = cmd.CreateParameter(); 
p.ParamterName = "V_XXX_XXX"; 
p.DbType = DbTypes.DateTime; 
p.Value = DateTime.Now; 
cmd.AddParamter(p); 
... 

...

여기에 잘못된 것이 있습니까? LUW의 경우 매개 변수를 DbTypes.DateTime으로 보내면 문제가 없습니다. 편집 : 로컬 테스트 코드 (예 : Now.Date)에서 잘린 날짜를 보내고 있기 때문에 LUW에서 정상적으로 작동했습니다. 일반 DateTime.Now은 이론적으로는 어떤 System.DbTypes로 변환, 변환 시간에 이야기 할 수 있도록

는 또한, 우리는, 유형에 전체 메타 데이터가)이 AS400에서 맘에 잘림 오류와 함께 실패합니다. 우리는 그것이 근본적인 문제가 아니라 모든 것이 끝나기를 바랄 뿐이다.

** 솔루션 **

감사합니다 @ 마이크 - 윌리스, 우리는 단지 명령을 생성하기 전에 열을 확인하고 필요한 경우 수동 절단 작업을 수행합니다.

// get the db2 column type from our model metadata, because in .net it is all just DateTime 
cmd.AddParamter("@MyDateColumn", FixParam(dateObject, metatdata.ColumnType); 

// fix up different types of parameters. real version does a lot more validation 
public object FixParam(object value, string db2columnType) { 
    if (db2columnType == "date") return ((DateTime)value).Date; 
    ... 
    return value; 
} 

감사합니다. 모든 DB2 사용자.

답변

1

i에서 오는 경우 DATE 필드에서 DateTime 필드로 지정할 수 있습니다. 는 I로 전송하기 위해

DateTime EmployeeSignedDateTime = i.Field<DateTime>("EMP_SIGNED_DATE").Add(i.Field<DateTime>("EMP_SIGNED_TIME").TimeOfDay) 

, 당신은 다음과 같은 것을 수행 할 수 있습니다 나는 IBM.Data.DB2.iSeries.dll을 사용하고

p.Add("@EMPLOYEE_SIGNED_DATE", iDB2DbType.iDB2Date).Value = DateTime.Now.Date; 
p.Add("@EMPLOYEE_SIGNED_TIME", iDB2DbType.iDB2Time).Value = DateTime.Now.ToString("HH.mm.ss"); 

참고.

+0

iSeries DLL을 사용하지 않으므로 'iDB2DbType' 구조에 액세스 할 수 없습니다. 나는 내일 아침 클라이언트 사이트에서 그것을 테스트 할 것인데, 여기서 우리는 생생한 호흡에 접근 할 수 있습니다. iSeries : D Looks Promsing. 우리는'DbTypes.DateTime'을 남겨 두지 만, 필요하다면'DbTypes.Date' 또한 변경할 수 있습니다. 디버깅 시간 : D –

관련 문제