Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка ошибок в MSSQL [D5, MSSQL]


Страницы:   1 2

Vick ©   (2003-12-04 18:01:00) 

Доброго всем вечера!!!

Можно ли в MSSQL производить обработку исключений, таки мобразом, чтобы выдавалось сообщение об ошибке, но процесс выполнения процедуры продолжался дальше???

Задача такая: идет запись данных в таблицу в цикле, на каком-то конкретном шаге попадается запись с неверной датой, типа 01.12.1003, возникает ошибка Error converting data type DBTYPE_DBDATE to datetimeи выполнение процедуры обрывается, а я хочу, чтобы процесс продолжался дальше...


Vick   (2003-12-05 12:31:00) [21]

а как быть с вариантом, когда файл битый в принцыпе (могут умники послать ярлык переименованный или какой другой файл)...
и даже если у него проблема олько с датой, то мне его нужно отбросить и записать в таблицу логов, что в этом файле ошибка...


sniknik   (2003-12-05 12:20:00) [22]

судя по всему проблема в запросе "insert into #shop_reports ... далее по тексту

вставь в OPENROWSET запрос поподробнее с полями
проблемные с датой оформи так (примерно)

вместо DATE_NEW к примеру (синтаксис MSSQL)
CASE ISDATE(DATE_NEW)
WHEN 1 THEN DATE_NEW
ELSE Null
END AS DATE_NEW
запрос должен продолжатся (просто неправильное поле будет пустым).
но вообшето OPENROWSET передает запрос провайдеру (в твоем случае ODBC dBase Driver) так что такой синтаксис скорее всего не пройдет
можно несколько вариантов попробовать
сменить OPENROWSET на OPENDATASOURCE (тогда синтаксис подойдет) он уже в MSSQL будет разбирать
либо написать так (тоже замена)
iif(isDate(DATE_NEW), DATE_NEW, Null) AS DATE_NEW
(это синтаксис jet) пройдет (скорее всего) в ODBC dBase Driver если jet был установлен
не пройдет сменить провайдера на jet.


Vick   (2003-12-05 11:55:00) [23]

>sniknik

Ну не обижай меня, я - ОНА!!! :)))

Привожу кусок кода:

DECLARE @hFiles varchar(8);
declare @S varchar(2000)

declare ID_CURSOR cursor local read_only FAST_FORWARD
for (select substring(files,1,8) as Files from #temp where files like "%pal%")

OPEN ID_CURSOR;
fetch next from ID_CURSOR into @hFiles;
while @@FETCH_STATUS = 0
begin
if @hFiles not in(select distinct [file_name] from palmira_test.dbo.SHOP_REPORTS
where [file_name] = @hfiles) begin
set @S =
"insert into #shop_reports([FILE_NAME], DIVISION, DIVISION_C, TYPE_DOC, NUM_DOC, ARTICUL,
CODE_EKKA, GROUPE_COD, GROUPE_TEX, DIV_COD, DIV_TEXT, NALOG_COD, NAME_EKKA, FCOD, NUMBER, PRICE,
PRICE_NEW, PRICE_CH, DAT_, DATE_NEW, DATE_CH, CLIENT_NAM, CLIENT_COD, CLIENT_ADR, COMMENT)
Select """ + @hFiles + """, DIVISION, DIVISION_C, TYPE_DOC, NUM_DOC, ARTICUL,
CODE_EKKA, GROUPE_COD, GROUPE_TEX, DIV_COD, DIV_TEXT, NALOG_COD, NAME_EKKA, FCOD, NUMBER, PRICE,
PRICE_NEW, PRICE_CH, DATE,
case when DATE_NEW = null then DATE else DATE_NEW end as DATE_NEW,
DATE_CH, CLIENT_NAM, CLIENT_COD, CLIENT_ADR, COMMENT
FROM OPENROWSET(""MSDASQL"",""DRIVER={Microsoft dBase Driver (*.dbf)}"",
""select * from d:\Mail\" + @hFiles + ".dbf"")";
exec(@S);
insert into Palmira_test.dbo.LOG_MAIL
select getdate(), "Загружен", @hFiles
end else
insert into Palmira_test.dbo.LOG_MAIL
select getdate(), "Такой файл уже есть", @hFiles
fetch next from ID_CURSOR into @hFiles;
end;
CLOSE ID_CURSOR;

insert into Palmira_test.dbo.Shop_reports
select * from #shop_reports

DEALLOCATE ID_CURSOR;

exec master..xp_cmdshell "del d:\Mail\??pal???.dbf"


А как DTS-packages написать, чтобы он брал файлы, которые мне нужны, их имя каждый день меняется!!!!


sniknik   (2003-12-05 11:47:00) [24]

Vick © (05.12.03 11:32) [8]
у нас разное понимание подробностей. :о((

не нужно то как тебе начальство должно задачу ставить. нужно описание структур таблиц, типы, провайдеры, как решаеш. код. где сложности (место в коде).

LordOfSilence © (05.12.03 11:41) [9]
???
у него судя по описанию (как я понял) в том же поле текстовом может быть как дата так и ахинея. как написать скрипты это и есть проблема.

Vick © (05.12.03 11:32) [8]
см. сюда LordOfSilence © (05.12.03 11:41) [9]
это и есть решение (одно из) но в общем (как я и говорил).


LordOfSilence   (2003-12-05 11:41:00) [25]

DTS-packages с ActiveX-скриптами


Vick   (2003-12-05 11:32:00) [26]

>sniknik

Описываю задачу по шагам:

1. Филиалы каждый вечер высылают свои отчеты в формате dbf в офис.

2. В офисе эти отчеты нужно загрузить в базу MSSQL в таблицу с аналогичными полями.

3. Отчетики я гружу в цикле сначала во временную таблицу (дабы уберегтись от повторной загрузки файла, ибо народ имеет привычку высылать по несколько раз одно и то же). Заранее я не знаю какая ошибка и в каком поле может быть сгенерирована глупым юзером. посему контролировать все 27 полей на наличие в них ошибок не имеет смысла. Может еще такая ситуация случиться, что файл будет битым (контрольная сумма не будет сходиться или еще чего-нть), следовательно при его чтении тоже возникнет ошибка.

4. Так вот, в процессе загрузки во временную таблицу, например, пятого файлика возникает ошибочка. Так вот я хочу этот файлик просто пропустить и перейти на следующий шаг цикла при возникновении оной.

Вот и вся задачка!!! :)))


sniknik   (2003-12-05 11:21:00) [27]

Vick © (05.12.03 11:15) [6]
> Задача в первом мессадже описана.
хотелось бы подробностей, на описание в общем виде и ответы будут анологичными. а как показывает практика их обычно "не понимают".
вспомни прошлую ветку, ответ был в первых же постах.

> ISDATE не поможет?
????


Vick   (2003-12-05 11:15:00) [28]

>sniknik

Задача в первом мессадже описана.
Но в дополнение - это все та же задача, что была и в Линке к другому серверу: приходят отчеты в dbf-ном формате, я должна закачать их в базу.
Тут такая фигня, что я заранее не знаю в каком поле в dbf-ом файле может быть какая-нть гадость, при этом обязательно возникнет ошибка и прервется работа совсем.


sniknik   (2003-12-05 11:06:00) [29]

Nikolay M. © (05.12.03 10:59) [4]
необязательно (хотя может быть это для его процедуры это самое естественное), можно просто CASE в запрос вставить (если вставка запросом).


Nikolay M.   (2003-12-05 10:59:00) [30]


> А что же тогда делать,

Например, апдейтить в цикле, в теле курсора.


sniknik   (2003-12-05 10:55:00) [31]

> А что же тогда делать
ISDATE не поможет? предварительно чтобы не доводить до исключения.

насчет остального, не зная задачи...


Vick   (2003-12-05 10:38:00) [32]

А что же тогда делать, так же все время будет натыкаться процесс а неправильный файл и останавливаться и не будет возможности выяснить, какой файл неверен, кроме как перебором. :(((( Или может есть другой способ?


me   (2003-12-04 21:18:00) [33]

Нет, так сделать нельзя. Более того - это ИМНО "дурной тон" при работе с сервером, который всегда обновляет данные в контексте транзакции


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо