Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > DataColumn.AutoIncrement не фунциклирует?


Автор: ExSoft 28.1.2009, 12:39
Дрозофила:
Код

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

Автор: Лен 29.1.2009, 09:45
Хм, вообще-то про автоинкремент ты в запросе ничего не сказал. Id у тебя при таких insert-ах всегда будет null, а те числа , которые ты видел - не Id, а скорее всего автонумерации строк. Читобы сделать автоинкремент, замени 
Код

create table #tmpTable(
     Id int null,
     Name varchar(256) null)
 на 
Код

create table #tmpTable(
     Id int identity (0, 1),
     Name varchar(256) null)


После этого сможешь выполнять добавление строк в виде 
Код

insert into #tmpTable values ('Иванов Иван Иванович')
 - так короче )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)