Дрозофила:
| Код | 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 |