2011-05-03 1 views
4

I는 표 B. 표 B에 나타난 A로부터 데이터를 복사하고 '는 I 값을 설정할 일반적으로 0 의 기본 제약 값을 갖는 열이 다음 접근자를 사용하는 열의 수입니다.ADO.NET CommandBuilder가,에 InsertCommand 및 기본 제약

public object this[string columnName] 
{ 
    get { return DataTable.Rows[CurrentRow][columnName]; } 
    set { DataTable.Rows[CurrentRow][columnName] = value; } 
} 

하지만

나는 전체 행을 삽입 내 널 (NULL) 열 X.

을 설정하지 마십시오는 기본값이 사용되지 않습니다. 0 대신 NULL 입력 가능 열에 NULL이 삽입되었습니다.

_sqlCommandBuilder = new SqlCommandBuilder(_sqlDataAdapter); 
_sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges; 
_sqlCommandBuilder.SetAllValues = false; 
_sqlDataAdapter.Update(DataTable); 

나는 또한 스키마를 얻을 :

_sqlDataAdapter.Fill(DataTable); 
_sqlDataAdapter.FillSchema(_dataTable, SchemaType.Mapped); 

내가 그것을 설정하지 않았더라도 왜 ADO.NET 설정 NULL 내 열 X에 대한인가?

필자는 열 X의 값을 설정하지 않으면 ADO.NET이 주어진 제약 조건에서 기본값을 가져 오는 것으로 생각했습니다.

ADO.NET CommandBuilder는 기본 제약 조건을 사용할 수 있습니까?

답변

3

DataAdapter에 대한 업데이트 방법을 구현하기 위해 CommandBuilder을 사용할 필요가 없습니다. CommandBuilder에는 많은 문제가 있습니다. DataAdapter.SelectCommandDataAdapter.UpdateCommand 속성을 DbCommand sql을 직접 지정하는 개체로 설정할 수 있습니다. 이렇게하면 CommandBuilder의 적절한 SQL 문 생성 기능에 내재 된 문제가 발생하지 않습니다.

업데이트 : CommandBuilder가이 기본값을 사용하려는 것을 알 수있는 방법이 없습니다

.삽입 문에 대해 생성 할 열이 있으면 삽입 문을 생성하는 것뿐입니다. 해당 열이 insert 문의 일부인 경우 해당 열에 대해 지정된 모든 값, 심지어 null이 삽입됩니다. 기본값은 insert 문에 포함시키지 않은 경우를위한 것입니다. 항목을 삽입하는 방법에 상관없이 null을 기본값으로 변환하지는 않습니다. CommandBuilder를 사용할지 여부를 결정합니다.

CommandBuilder를 사용하려는이 길을 계속하면 더 큰 슬픔을 느낄 것입니다. select 절에서 간단한 join 문도 처리 할 수 ​​없습니다. 또한 기본 키가 필요합니다. 이 중 하나라도 위반되면 올바른 업데이트, 삽입 및 삭제 문을 생성 할 수 없습니다. SQL Server와 Oracle의 두 공급자 만이이 클래스를 구현했으며 오라클은 위에서 언급 한 기본 문제를 해결하지 못한 버그가있는 것으로 알려져 있습니다.

DbDataReader를 통해 선택 DbCommand의 출력을 통해 두 개의 DbCommand 개체 (선택 항목과 삽입 항목 중 하나)를 사용한 경우 해당 열의 null을 쉽게 확인하고 기본값 0으로 제공 할 수 있습니다 당신은 그것이 무엇인지 알기 때문에 DbCommand를 삽입하십시오. 데이터베이스의 규칙을 알고 필요한 경우 사용하는 것은 모든 종류의 코드 조직 규칙을 위반하지 않습니다. 이런 종류의 코드를 작성하려면 데이터베이스에 무엇이 있는지를 알아야합니다.

SQL Server 2005 이상인 경우 INSERT INTO .. SELECT 문을 사용하는 것이 좋습니다. sql이 충분하면 CASE 절을 사용하여 하나의 sql 문을 만들 수 있습니다.

+0

나는 수동으로 진술을 작성, 삭제, 생성하고 싶지 않다. 나는 너를 올바르게 이해하기를 바란다. 그렇지 않다면 알려주세요 :) – Rookian

+0

테이블에 행을 추가 할 때 설정 한 열만이 insert 문에 포함되어 기본값을 올바르게 표시 할 수 있다고 생각할 것입니다. 이것은 ADODB에서 작동했습니다. ADO.NET이이 기능을 잃어 버렸습니다. – Brain2000

0

약간의 질문이지만, 분명히 보일 수도 있지만 사실 까다 롭습니다. 내가 MSDN definition을 인용하는 경우

_sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges; 

당신이 읽을 수 있습니다 : (1) 대신 기본 키의 일부 camses에 IDENTITY를 정의하는 데 사용

"If no PrimaryKey is defined, all searchable columns are included in the WHERE clause." 

내 친구.

약간의 질문은 "업데이트 된"테이블 B에서 기본 키를 사용합니까? 다음



....

이 SqlAdapter.FillSchema은 FillSchema를하여 검색 정보 여기에 기본 값 을 사용할 수 있습니다하지 않고, 정보를 추가하려면 :

AllowDBNull 
AutoIncrement.You must set AutoIncrementStep and AutoIncrementSeed separately. 
MaxLength 
ReadOnly 
Unique 

(견적에서을 MSDN site)

고유

+0

기본 키가 정의되어 있지만 두 번째 정보는 유익합니다. 감사합니다. :) 그러나 내 문제는 해결되지 않았습니다. – Rookian