[ADO.Net] DataColumn.AutoIncrement не фунциклирует?
От: Ex_Soft  
Дата: 28.01.09 10:24
Оценка:
Дрозофила:
create procedure sp_Select_NULL
   @IsSelectNull bit=0
as
begin
   create table #tmpTable(
     Id int null,
     Name varchar(256) null)

   insert into #tmpTable (Name) values ('Иванов Иван Иванович')
   insert into #tmpTable (Name) values ('Петров Петр Петрович')
   insert into #tmpTable (Name) values ('Сидоров Сидор Сидорович')
   insert into #tmpTable (Name) values ('Александров Александр Александрович')

   if @IsSelectNull=1
     select Id, Name from #tmpTable
   else
     select Name from #tmpTable

   drop table #tmpTable
end
go

tmpDataTable=new DataTable();
tmpDataColumn=tmpDataTable.Columns.Add("Id",typeof(int));
tmpDataColumn.AllowDBNull=false;
tmpDataColumn.Unique=true;
tmpDataColumn.AutoIncrement=true;
tmpDataColumn.AutoIncrementSeed=1;
tmpDataColumn.AutoIncrementStep=1;
tmpDataTable.PrimaryKey=new DataColumn[]{tmpDataTable.Columns["Id"]};

da=new OleDbDataAdapter("{call sp_Select_NULL}",cn);
da.Fill(tmpDataTable); // 1

tmpDataTable.Clear();
da.SelectCommand.CommandText="{call sp_Select_NULL(?)}";
da.SelectCommand.Parameters.Add("IsSelectNull",OleDbType.Boolean).Value=true;
da.Fill(tmpDataTable); // 2

Первый DataAdapter.Fill (когда SP возвращает только Name) — отрабатывает как в букварике написано: т.е. Id инициализируется и инкрементируется. А, вот, второй раз (когда SP возвращает и Id (NULL), и Name) имеем System.Data.ConstraintException:

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

Это так надо? Т.е. если что-нибудь (пусть даже NULL) возвращается в резалтсете, то весь механизм DataColumn.AutoIncrement'а преспокойно курит в сторонке? Или, все же, это както можно растолкать? Конечно, я понимаю, что, в случае, когда часть записей имеет Id, а часть — нЭт, получаем: "...здесь — играем, здесь — не играем, а здесь — рыбу заворачивали..." со всеми вытекающими. Но все же?

P.S. Проверил на FW1.1+NDP1.1sp1-KB887549-X86 && FW2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.