2014-04-24 2 views
0

나는 SQL Server에서 잘 작동하는 응용 프로그램을 가지고 있습니다. 저는 DevExpress 그리드를 가지고 있습니다.이 그리드는 컨베이어 모드의 레코드를 보여줍니다 (이 점이 중요하지는 않습니다.).MySqlDataAdapter.Update (DataTable)의 DATETIME 필드를 무시 하시겠습니까?

이제 코드를 데이터베이스에 무관하게 변경하고 MySql을 테스트하고 있습니다. 사용자가 레코드를 수정하고 변경 사항을 승인 할 때, 나는 다음과 같은 오류 얻고 있었다 : 몇 가지 조사 후

Concurrency violation: the UpdateCommand affected 0 of the expected 1 records

을, 나는 문제가 DATETIME 필드에 놓여 conclussion 오셨습니다. "Allow Zero Datetime = False; Convert Zero Datetime = True;"를 사용하고 있습니다. 내 MySQL 연결 문자열에 있으므로 기본 DATETIME 값을 .NET DateTime 객체로 변환 할 수 있습니다. 자동 생성 된 UpdateCommand에는 where 절의 모든 필드가 포함되어 있으며 DATETIME 필드를 제거하면 MySql DATETIME이 기본값으로 설정된 경우 비교가 실패한 것 같습니다.

기본 키 열이 있는데 사용자가이를 수정할 수 없으므로 WHERE 절에 필드가 하나만 있도록 사용자 지정 UpdateCommand를 실행하는 올바른 방법은 무엇입니까? 수용성 변경

내 현재 코드 :

Dim builder As DbCommandBuilder = m_Conn.CreateCommandBuilder(m_Adapter) 
m_Adapter.Update(m_DataTable) 

CreateCommandBuilder는 DbCommandBuilder 인터페이스의 정확한 implementatin으로 올바른 객체를 생성하기에 IDbConnection을 확장 방법.

답변

1

DBCommandBuilder에는 ConflictOption 속성을 설정해야합니다. 아마도 ConflictOption.OverwriteChanges로 설정하려고합니다. 당신이 CommandBuilder가 생성자를 통해 어댑터 명령을 초기화 할 때 작동하지만

var builder = new MySqlCommandBuilder(); 
builder.ConflictOption = ConflictOption.OverwriteChanges; 
builder.DataAdapter = m_Adapter; 

이해야 할 경우

는 잘 모르겠어요.

+0

대단원! 이것은 트릭을했다. 고맙습니다. – raven

1

연결 문자열에 익숙하지 않은 "Allow Zero Datetime=False; Convert Zero Datetime=True;"을 사용하는 대신 DateTime.Parse (값)를 사용하는 것이 좋습니다. 아마도 널 (null)을 쉽게 처리 할 수 ​​있도록 함수를 작성하는 것이 좋습니다.

private DateTime getDateTimeField(string dbValue) 
{ 
    if (dbValue == null) 
    { 
     return new DateTime(); 
    } 
    else { 
     return DateTime.Parse(dbValue); 
    } 
} 
+0

대단히 감사합니다, @ ErikusMaximus,하지만 이건 내 문제를 해결하지 못합니다. 데이터에 수동으로 액세스하는 경우 귀하의 대답이 효과가 있습니다. 그러나 Zero DateTime 옵션을 지정하지 않으면 DataSource에 할당하려고 할 때 그리드에서 예외가 발생합니다. – raven

관련 문제