Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запись с таким кдючём имеется / 20 сообщений из 20, страница 1 из 1
14.01.2013, 13:47
    #38109171
Vova_1805
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Тема: DataGridView
Среда Visual Basic STUDIO’2010 Professional
При добавлении новой строки в DataGridView
Запись с таким ключём уже имеется.
Как обработать эту ситуацию при добавлении
В таблицу новой записи?
Спасибо.
Код: vbnet
1.
2.
3.
4.
SqlCom = New OleDb.OleDbCommand("INSERT INTO [Pensioner] ([Identity], [LastName], [FirstName], [patronymic]) VALUES (1951503509, 'Фамилия_1','Имя_1','Отчество_1')", Con)
Con.Open()
SqlCom.ExecuteNonQuery()
Con.Close()
...
Рейтинг: 0 / 0
14.01.2013, 14:05
    #38109194
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Код: plaintext
VALUES (1951503509, 'Фамилия_1','Имя_1','Отчество_1')", Con)
Параметры придумали трусы.

Код: plaintext
([Identity], 
возможно, мой тепепатический аппарат подсказывает неверно, но при таких названиях обычно идут автоинкрементные поля. Может, забыли автоинкремент поставить?


Vova_1805Как обработать эту ситуацию при добавлении
В таблицу новой записи?
Код: sql
1.
2.
3.
4.
5.
6.
7.
if not exists (select 1 from table where id = @id)
	insert into table
-- необязательная часть
else
	update table set
	...
	where id = @id
...
Рейтинг: 0 / 0
14.01.2013, 14:15
    #38109210
Sergey TSV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Только это C#, а не Visual Basic
Код: c#
1.
2.
3.
4.
SqlCom = New OleDb.OleDbCommand("INSERT INTO [Pensioner] ([LastName], [FirstName], [patronymic]) VALUES ('Фамилия_1','Имя_1','Отчество_1')", Con)
Con.Open()
SqlCom.ExecuteNonQuery()
Con.Close()
...
Рейтинг: 0 / 0
14.01.2013, 14:25
    #38109238
Vova_1805
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
автоинкремент
используется в том случае, когда ключём служит
поле данных типа СЧЁТЧИК, который в моей ситуации НЕРАЗУМНО ПРИМЕНЯТЬ.
В моеё ситуации ключём служит ИДЕНТИФИКВЦИОННЫЙ КОД,
выдаваемый налоговой инспекцией, а он УНИКАЛЬНЫЙ
ДЛЯ КАЖДОГО ГРАЖДАНИНА.
Вот почему при вводе надо проверять.
...
Рейтинг: 0 / 0
14.01.2013, 14:27
    #38109247
Vova_1805
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
как применить приведенный Вами текст к VB.NET STUDIO'2010
авторif not exists (select 1 from table where id = @id)
insert into table
-- необязательная часть
else
update table set
...
where id = @id
...
Рейтинг: 0 / 0
14.01.2013, 14:55
    #38109320
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Vova_1805как применить приведенный Вами текст к VB.NET STUDIO'2010
авторif not exists (select 1 from table where id = @id)
insert into table
-- необязательная часть
else
update table set
...
where id = @idЭто TSQL, если будете через процедуру менять записи в таблице
...
Рейтинг: 0 / 0
14.01.2013, 15:26
    #38109419
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Vova_1805УНИКАЛЬНЫЙ
ДЛЯ КАЖДОГО ГРАЖДАНИНА

Не уникальный. Я переезжал с Питера в Москву, и в местной налоговой разбирался, почему на меня было открыто сразу 3 ИНН. Оказалось, что у меня был + не разбираясь сразу две госструктуры оформили мне новые. Кажется, какая-то заморочка была, что при регистрации в новом регионе старый ИНН теряет силу, и выписывается новый.

Так что предусматривайте ситуацию в программе, когда у человека может меняться ИНН. Возможно, номер пенсионного удостоверения будет лучшим выбором?

Если говорить о моем выборе - я сторонник суррогатных ключей. И в данном случае выбрал бы автогенерацию GUID. Всякие ИНН и прочие натуральные ключи - доп поле + индекс на нем.

Vova_1805Вот почему при вводе надо проверять
Проверка осуществляется по достаточно простому алгоритму, который доступен и для дошкольников: поискать по ключу, и если не найдено - делать инсерт.

Vova_1805как применить приведенный Вами текст
Поскольку вы постеснялись указать, с какой СУБД вы работаете, я привел псевдокод а-ля T-SQL. В VB.NET я не рублю, поэтому приблизительный код для шарпа (хотя, как правильно заметили выше, ваш код и есть шарповый):


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
using (var sqlCon = new OleDbConnection(@"..."))
{
    sqlCon.Open();

    using (var sqlCmd = new OleDbCommand() {CommandType = CommandType.Text})
    {
        sqlCmd.CommandText = "if not exists (select 1 from [Pensioner] where [Identity] = @id)" +
                             "insert into [Pensioner] ([LastName], [FirstName], [patronymic]) values (@id, @lastName, @firstName, @patr)";
        sqlCmd.Parameters.AddRange(new OleDbParameter[]
            {
                new OleDbParameter("@id", 123456), 
                new OleDbParameter("@lastName", "Фамилия_1"),
                new OleDbParameter("@firstName", "Имя_1"),
                new OleDbParameter("@patr", "Отчество_1"),
            });


        sqlCmd.ExecuteNonQuery();
    }

    sqlCon.Close();
}
...
Рейтинг: 0 / 0
14.01.2013, 15:28
    #38109425
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
забыл поле Identity указать в списке названий столбцов:
Код: c#
1.
([Indentity], [LastName], [FirstName
...
Рейтинг: 0 / 0
14.01.2013, 18:55
    #38109847
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Vova_1805поле данных типа СЧЁТЧИК, который в моей ситуации НЕРАЗУМНО ПРИМЕНЯТЬ.
В моеё ситуации ключём служит ИДЕНТИФИКВЦИОННЫЙ КОД,
выдаваемый налоговой инспекцией, а он УНИКАЛЬНЫЙ
ДЛЯ КАЖДОГО ГРАЖДАНИНА.
НЕРАЗУМНО ВЕРИТЬ, что этот код будет неизменен.

Согласно п.3.1. Порядка и условий присвоения, применения, а также изменения идентификационного номера налогоплательщика при постановке на учет, снятии с учета юридических и физических лиц, утвержденных приказом МНС России от 03.03.2004 №БГ-3-09/178 (зарегистрирован в Минюсте России 24.03.2004 №5685) (далее – Порядок) присвоенный физическому лицу идентификационный номер налогоплательщика (ИНН) не подлежит изменению, за исключением случаев внесения изменений в нормативные правовые акты Российской Федерации либо изменения его структуры в связи с внесением изменений в положения раздела 1 Порядка.

Vova_1805, Вы уверены, что изменения в нормативные акты невозможны?
...
Рейтинг: 0 / 0
15.01.2013, 08:42
    #38110243
Ken@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Arm79,

авторсторонник суррогатных ключей. И в данном случае выбрал бы автогенерацию GUID.
Более худшего решения для перфоманса придумать сложно.
...
Рейтинг: 0 / 0
15.01.2013, 10:20
    #38110315
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Ken@t,

О чем речь? У него идет учет пользователей. Где вы видите там перфоманс?
...
Рейтинг: 0 / 0
15.01.2013, 10:29
    #38110326
Ken@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Arm79Ken@t,

О чем речь? У него идет учет пользователей. Где вы видите там перфоманс?
Вроде по русски написал же.

Зы . у вас суррогатные PK с типом GUID - кластерные ?
...
Рейтинг: 0 / 0
15.01.2013, 10:43
    #38110339
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Ken@tВроде по русски написал же.
Зы . у вас суррогатные PK с типом GUID - кластерные ?

1) Нет, не кластерные
2) Я пытаюсь вам сказать, что даже если бы и были кластерные, при учете пользователей это не принципиально, не такая там большая таблица. И особенность её такова, что большинство транзакций являются транзакциями на чтение
...
Рейтинг: 0 / 0
15.01.2013, 11:04
    #38110363
Ken@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Arm79,

1 В том , что PK строки таблицы GUID нет ничего полохо или хорошего, но
...
Рейтинг: 0 / 0
15.01.2013, 11:16
    #38110384
Ken@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
2. В таком случае PK должен быть не кластерным, в противном случае дефрагментация индекса при добавлении со всеми вытекающими.
3. Настоящий ключ вырождается в Unique .
4. Надо понимать, что будет кластерным индексом.
5. Надо понимать,что увеличение размерности строки.

Вообще, GUID в качестве PK , скорее суррогатные ключи - чаще всего ошибки проектирования, на практике.
...
Рейтинг: 0 / 0
15.01.2013, 11:28
    #38110403
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Ken@tВ таком случае PK должен быть не кластерным, в противном случае дефрагментация индекса при добавлении со всеми вытекающими
Может и кластерным, NEWSEQUENTIALID()
Можно и по джобу перестраивать индексы, и так далее.

Ken@tНастоящий ключ вырождается в Unique
тут не понял, можно уточнить?

Ken@tНадо понимать, что будет кластерным индексом
я бы выбрал LastName (это же фамилия у ТС?)

Ken@tНадо понимать,что увеличение размерности строки
Какой строки? Какой размерности? если речь идет о UNIQUEIDENTIFIER, то там 16 байт всего

Ken@tGUID в качестве PK , скорее суррогатные ключи - чаще всего ошибки проектирования, на практике
Не всегда. GUID для репликационных вещей удобнее всего ИМХО. У ТС учет пользователей. Есть вероятность, что база будет распределенная.
...
Рейтинг: 0 / 0
15.01.2013, 14:58
    #38110771
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Код: plaintext
1.
2.
3.
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
	Apr  2 2010 15:48:46 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )

Скрипт на табличных переменных
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
declare @t1 table (id int identity(1, 1) primary key, txt nvarchar(100))
declare @t2 table (id bigint identity(1, 1) primary key, txt nvarchar(100))
declare @t3 table (id uniqueidentifier default newid() primary key, txt nvarchar(100))
declare @t4 table (id uniqueidentifier default newsequentialid() primary key, txt nvarchar(100))

declare @id int
declare @dt1 datetime2
declare @dt2 datetime2


set @dt1 = GETDATE()
set @id = 0
while @id < 100000
begin
	insert into @t1 (txt) values ('bgjkbfhsdbfbsdjlkjbnckjlsdbcdbscbsdbcbsdcb')
	set @id += 1
end
set @dt2 = GETDATE()
select DATEDIFF(ms, @dt1, @dt2) 'INT'

set @dt1 = GETDATE()
set @id = 0
while @id < 100000
begin
	insert into @t2 (txt) values ('bgjkbfhsdbfbsdjlkjbnckjlsdbcdbscbsdbcbsdcb')
	set @id += 1
end
set @dt2 = GETDATE()
select DATEDIFF(ms, @dt1, @dt2) 'BIGINT'

set @dt1 = GETDATE()
set @id = 0
while @id < 100000
begin
	insert into @t3 (txt) values ('bgjkbfhsdbfbsdjlkjbnckjlsdbcdbscbsdbcbsdcb')
	set @id += 1
end
set @dt2 = GETDATE()
select DATEDIFF(ms, @dt1, @dt2) 'NEWID'

set @dt1 = GETDATE()
set @id = 0
while @id < 100000
begin
	insert into @t4 (txt) values ('bgjkbfhsdbfbsdjlkjbnckjlsdbcdbscbsdbcbsdcb')
	set @id += 1
end
set @dt2 = GETDATE()
select DATEDIFF(ms, @dt1, @dt2) 'NEWSEQUENTIALID'




результаты:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
INT
-----------
3227

BIGINT
-----------
3546

NEWID
-----------
3160

NEWSEQUENTIALID
---------------
2967

Скрипт на временных таблицах
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
create table #t1(id int identity(1, 1) primary key, txt nvarchar(100))
create table #t2(id bigint identity(1, 1) primary key, txt nvarchar(100))
create table #t3(id uniqueidentifier default newid() primary key, txt nvarchar(100))
create table #t4(id uniqueidentifier default newsequentialid() primary key, txt nvarchar(100))

declare @id int
declare @dt1 datetime2
declare @dt2 datetime2


set @dt1 = GETDATE()
set @id = 0
while @id < 100000
begin
	insert into #t1 (txt) values ('bgjkbfhsdbfbsdjlkjbnckjlsdbcdbscbsdbcbsdcb')
	set @id += 1
end
set @dt2 = GETDATE()
select DATEDIFF(ms, @dt1, @dt2) 'INT'

set @dt1 = GETDATE()
set @id = 0
while @id < 100000
begin
	insert into #t2 (txt) values ('bgjkbfhsdbfbsdjlkjbnckjlsdbcdbscbsdbcbsdcb')
	set @id += 1
end
set @dt2 = GETDATE()
select DATEDIFF(ms, @dt1, @dt2) 'BIGINT'

set @dt1 = GETDATE()
set @id = 0
while @id < 100000
begin
	insert into #t3 (txt) values ('bgjkbfhsdbfbsdjlkjbnckjlsdbcdbscbsdbcbsdcb')
	set @id += 1
end
set @dt2 = GETDATE()
select DATEDIFF(ms, @dt1, @dt2) 'NEWID'

set @dt1 = GETDATE()
set @id = 0
while @id < 100000
begin
	insert into #t4 (txt) values ('bgjkbfhsdbfbsdjlkjbnckjlsdbcdbscbsdbcbsdcb')
	set @id += 1
end
set @dt2 = GETDATE()
select DATEDIFF(ms, @dt1, @dt2) 'NEWSEQUENTIALID'

drop table #t1
drop table #t2
drop table #t3
drop table #t4



результаты:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
INT
-----------
3310

BIGINT
-----------
3640

NEWID
-----------
3420

NEWSEQUENTIALID
---------------
2937

скрипт для кластерных индеков приводить не буду, он такой же, ниже результаты:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
INT
-----------
6847

BIGINT
-----------
6920

NEWID
-----------
7423

NEWSEQUENTIALID
---------------
6120

Вариант с NEWSEQUENTIALID оказался быстрее всех, сколько бы итераций теста не запускал. Остальные три варианта более менее близки друг другу.
...
Рейтинг: 0 / 0
16.01.2013, 09:08
    #38111649
Ken@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Arm79,
А причём здесь оценка скростив вставки в БД ? Было же В таком случае PK должен быть не кластерным, в противном случае дефрагментация индекса при добавлении со всеми вытекающими

Вот оно дефрагментация индекса и падение производительности при использовании GUID.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
DROP TABLE dbo.PersonU 
GO
DROP TABLE dbo.PersonI 
GO
CREATE TABLE dbo.PersonU 
(
 SPK UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID() PRIMARY KEY
 ,SomeField VARCHAR(25)
)
GO
CREATE TABLE dbo.PersonI
(
 Id INT IDENTITY (0 , 1 ) NOT NULL PRIMARY KEY
 ,SomeField VARCHAR(25)
)
GO
DECLARE @I INT 

SET @I = 0 
WHILE ( @I < 100000 ) BEGIN
 INSERT dbo.PersonU  (SomeField) 
 SELECT CONVERT(VARCHAR(25), @I ) 
 SET @I = @I +1
END

SET @I = 0 
WHILE ( @I < 100000 ) BEGIN
 INSERT dbo.PersonI  (SomeField) 
 SELECT CONVERT(VARCHAR(25), @I ) 
 SET @I = @I +1
END
GO


SELECT  
  OBJECT_NAME(object_id)
 -- ,index_id 
  ,index_type_desc 
  ,avg_fragmentation_in_percent 
  ,fragment_count 
  ,avg_fragment_size_in_pages 
  ,page_count 
  ,CASE 
   WHEN avg_fragmentation_in_percent < 5.0 THEN 'NOTHING'
   WHEN avg_fragmentation_in_percent > 5.0 AND avg_fragmentation_in_percent < 30.0 THEN 'REORGANIZE'
   WHEN avg_fragmentation_in_percent >= 30.0 THEN 'REBUILD '   
   END 
FROM
  sys.dm_db_index_physical_stats (DB_ID(),NULL,NULL,NULL,NULL) 
  WHERE OBJECT_NAME(object_id) IN ('PersonU', 'PersonI' )



Ещё раз - идентификатор строки может быть суррогатным GUID , но никогда не кластерным, вмести с этим натруальный ключ - становится уникальным ограничением, индексом . Остаётся определить требование к кластерному индексу или это куча будет.

К репликации GUID то же с какого боку ?
...
Рейтинг: 0 / 0
16.01.2013, 09:14
    #38111654
Ken@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
И ещё Кластерный индекс . То есть для поля LastName которое не уникально произошло бы увеличение таблицы ещё на 16 байт. Перевед архитектору и DBA/
...
Рейтинг: 0 / 0
16.01.2013, 11:26
    #38111835
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись с таким кдючём имеется
Ken@tЕщё раз - идентификатор строки может быть суррогатным GUID , но никогда не кластерным, вмести с этим натруальный ключ - становится уникальным ограничением, индексом . Остаётся определить требование к кластерному индексу или это куча будет.

К репликации GUID то же с какого боку ?

Это вы в общем, а обсуждаем мы таблицу ТС.

Я утверждаю, что основное ограничение в использовании GUID в качестве суррогатного КЛАСТЕРНОГО ключа обходится использованием NEWSEQUENTIALID() вместо указанного вами NEWID()

Далее, после вставки 100 тысяч элементов типа Пользователь по NEWID(), ествественно, индекс будет сильно фрагментированным. Но вы не учитываете специфику таблицы. Эта таблица будет редко пополняемой. То есть массовых вставок новых данных не будет. И необходимость перестроения индексов после первого раза будет редкой.

Зачем далеко ходить, вот обсуждение GUID для репликации

Ken@tИ ещё Кластерный индекс . То есть для поля LastName которое не уникально произошло бы увеличение таблицы ещё на 16 байт. Перевед архитектору и DBA/

У ТС нет натурального уникального ключа. Ни по одному из столбцов. Поэтому естественный выбор для кластерного индекса из представленного в наличии - это наиболее часто используемое поле. Я думаю, что это Фамилия.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запись с таким кдючём имеется / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]