Форум: "Прочее";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
Вниз1C 7.7 + Delphi + ADO + MS SQL Найти похожие ветки
← →
Knight © (2008-05-27 16:37) [0]У кого-нить есть открытый пример внешней компоненты 1С 7.7 на Delphi для забора данных из базы MS SQL с использованием хранимых процедур?
← →
tesseract © (2008-05-27 16:46) [1]Тут смотри, правда геммороя много.....
http://www.1cpp.ru/forum/YaBB.pl
← →
Ослик (2008-05-27 17:48) [2]Зачем Дельфи?
Из 1с 7.7 можно напрямую работать с чем угодно, хоть с mssql, хоть с Ороклом или IB, лишь бы был установлен в системе соответствующий OLEDB или ODBC драйвер.
← →
Knight © (2008-05-28 08:02) [3]> [2] Ослик (27.05.08 17:48)
Можно пример или что-то что можно использовать для поиска оного?
В доке ничего не нашёл.
← →
Knight © (2008-05-28 09:09) [4]Нужно из базы другой программы загрузить данные в обработку для формирования отчёта, используя хранимые процедуры...
← →
Ослик (2008-05-28 10:58) [5]Дело в том, что язык 1с позволяет создавать экземпляры любых ОЛЕ объектов и работать с ними.
Единственная досадная проблема заключается в том, что в 1с7.7 нет значения null. Но я всегда как-то находил пути обхода этого.
Пример работы с SP на MSSQL:
Процедура Сформировать()
adParamInput = 1;
adParamOutPut = 2;
adParamReturnValue = 4;
adInteger = 3;
adCurrency = 6;
adDecimal = 14;
adBigInt = 20;
adNumeric = 131;
adDate = 7;
adChar = 129;
adVarChar = 200;
adLongVarChar = 201;
con = СоздатьОбъект("ADODB.Connection");
con.Open("Provider=SQLOLEDB;Data Source=(local);Initial Catalog=cas;User ID=cas;Password=1;");
cmd = СоздатьОбъект("ADODB.Command");
cmd.ActiveConnection = con;
cmd.CommandType = 1;
cmd.CommandText = "exec ? = cas.test_sp @test_string = ?, @test_date = ?";
cmd.Parameters.Append(cmd.CreateParameter("@RetVal" , adInteger , adParamReturnValue));
cmd.Parameters.Append(cmd.CreateParameter("@test_string" , adVarChar , adParamInput, 50 ));
cmd.Parameters.Append(cmd.CreateParameter("@test_date" , adDate , adParamInput));
cmd.Parameters(1).Value = "проба пера";
cmd.Parameters(2).Value = РабочаяДата();
cmd.Execute();
con.Close();
Сообщить(cmd.Parameters("@RetVal").Value);
КонецПроцедуры
← →
Ослик (2008-05-28 11:01) [6]Также можно получать рекордсет и полноценно работать с ним, как работал-бы из дельфи.
← →
Knight © (2008-05-28 11:40) [7]> [6] Ослик (28.05.08 11:01)
А как сет вернуть?
← →
Slym © (2008-05-28 11:55) [8]con.Execute("Select * from table");
или
Recordset = СоздатьОбъект("ADODB.Recordset");
Recordset.Open("Select * from table", con, adOpenStatic, adLockOptimistic);
← →
Ослик (2008-05-28 12:04) [9]Или в моем примере если test_sp возвращает рекордсет, то вместо
cmd.Execute();
что-то типа:
rs = cmd.Execute();
и уже работай с ним.
Но вообще, это уже вопросы не по 1с, а по АДО.
Смотри исходники АДО компонент в Дельфи и делай также в 1С. Или книжку купи/скачай по технологии АДО. На сайте Микрософта, кажись, бесплатная валялась для скачивания, но могу и наврать.
← →
Knight © (2008-05-28 12:31) [10]Спасибо. Законнектилось... осталось выянить как поля из сета взять... пошёл искать. С АДО как-то до сих пор не сталкивался :)
← →
Ослик (2008-05-28 12:39) [11]http://www.podgoretsky.com/ftp/Docs/DB/chm/ProgADO.chm
← →
Knight © (2008-05-28 12:59) [12]Во нашёл
http://www.kb.mista.ru/article.php?id=309
← →
Ослик (2008-05-28 13:52) [13]Там фигня какая-то.
Предлагают работать с дбф-камим через АДО, хотя "родной" движок 1с работает с дбф-ками более чем на порядок быстрее.
К тому-же mssql может вернуть сразу несколько рекордсетов, что будешь делать в этом случае?
Лучше скачай нормальную книжку по моей ссылке, там все есть.
:)
← →
Knight © (2008-05-28 14:36) [14]> [13] Ослик (28.05.08 13:52)
Что-то заработало!!!!
ЕЕЕЕЕ!!!
:))))))))
Книгу скачаю, но поищу русский аналог. Мой инглишь не на столько крут :)
← →
Knight © (2008-05-28 14:37) [15]Да... ещё раз спасибо %)
:ПЫВО:
← →
tesseract © (2008-05-28 14:40) [16]
> хотя "родной" движок 1с работает с дбф-ками более чем на
> порядок быстрее.
Насмешил, спасибо.
Я то всё дурак на прямые запросы перевёл с таймером - а 1с видишь-ли быстрее..... Может 1С ещё и MEMO поддерживать научилась ?
← →
Ослик (2008-05-28 15:09) [17][16] tesseract © (28.05.08 14:40)
Конечно быстрее, я несколько лет назад делал тесты.
Впрочем, наверняка быстродействие зависит от задачи, возможно у тебя было что-то, когда куча прослоек и оберток оказались быстрее простого файлового доступа. Но, сомневаюсь. :)
С мемо, кстати, когда то раньше работала, я хорошо помню в древних версиях 1с мемофайлы у дбф-ок, но может это было еще в 7.5.
Сейчас если нужна работа с дбф-ками с мемофайлами, конечно придется использовать АДО или что-то еще.
Вообще, из 1с работать с дбф-ками, на мой скромный взгляд, имеет смысл только для экспорта/импорта с другими системами и когда нет нормального доступа к СУБД этих других систем.
Кстати, а что такое "с таймером"? :)
← →
Knight © (2008-05-28 15:14) [18]Ещё раз влезу...
Беру из базы поле DateTime, а 1с отображается только дата. Как указать?
← →
tesseract © (2008-05-28 16:11) [19]
> Кстати, а что такое "с таймером"? :)
_GetPerformanceCounter()
> Конечно быстрее, я несколько лет назад делал тесты.
И какие интересно ? Последовательный перебор ? Если ты в индексы не попадал, то возможно и медленее. Так, запрос через ADO примерно в 5-10 раз быстрее встроенного парсера. Иначе бы вопрос не поднимался.
> я хорошо помню в древних версиях 1с мемофайлы у дбф-ок,
> но может это было еще в 7.5.
Сейчас они через кучу срочек эмулируються в DBF версии.
> Беру из базы поле DateTime, а 1с отображается только дата.
> Как указать?
В 1с нет такого типа данных "время". Существует только поле у документа, которое можно задать через функцию УстановитьВремя().
← →
Ослик (2008-05-28 16:14) [20]Вариант которым я всегда пользовался, это в SQL запросе привести к тексту.
Например:
CONVERT(VARCHAR, GETDATE(), 108)
вернет только время ввиде текста "ЧЧ:ММ:СС"
← →
Ослик (2008-05-28 16:18) [21]В [20] был ответ к [18] Knight © (28.05.08 15:14)
[19] tesseract © (28.05.08 16:11)
> Если ты в индексы не попадал, то возможно и медленее. Так,
> запрос через ADO примерно в 5-10 раз быстрее встроенного
> парсера. Иначе бы вопрос не поднимался.
Ты точно говоришь про ДБФ-ки?
Надо будет восстановить в памяти, мне всегда казалось, что с ДБФ-ками 1С работает шестрее всего.
Давно уже забросил все это дело.
По поводу того, как сейчас реализована работа с полями переменной длины в 1С я в курсе.
← →
tesseract © (2008-05-28 16:21) [22]
> Надо будет восстановить в памяти, мне всегда казалось, что
> с ДБФ-ками 1С работает шестрее всего.
Прямой запрос быстрее намного. Про SQL вообще молчу, скорость выборки астрономическая по сравнению с 1с-вскими запросами. Десятки раз.
← →
Knight © (2008-05-29 11:47) [23]Данные идут... осталось добить процедуры.
Может кто в курсе как передать из 1с параметр типа datetime?
Ошибка: ADODB.Command: Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
← →
Ослик (2008-05-29 12:03) [24][23] Knight © (29.05.08 11:47)
Я же в [5] написал.
Как-раз дату передаю в параметр @test_date, чтоб такого вопроса не возникло. :)
← →
Knight © (2008-05-29 12:09) [25]> [24] Ослик (29.05.08 12:03)
У тя Date (7) а у меня datetime (135)
← →
Ослик (2008-05-29 12:12) [26][25] Knight © (29.05.08 12:09)
Процедура выглядит вот-так:CREATE PROCEDURE [cas].[test_sp]
(
@test_string NVARCHAR(50),
@test_date DATETIME
)
AS
RETURN 100
так что все-таки datetime.
← →
Knight © (2008-05-29 14:40) [27]Всё-равно пищит, что несовпадение типов :(
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c