Имя: Пароль:
1C
 
ADO, SQL и 1с
Ø
0 Omi1
 
15.12.04
16:18
При обращении к результатам работы запроса например:
Rs.MoveFirst();
Пока Rs.EOF() = 0 do
  Value1 = Rs.Fields("FieldName1”).Value;
    Rs.MoveNext();
КонецЦикла;
если поле "FieldName1" имеет например тип значения "timestamp" 1с не понимает такое значение что делать? Можно ли получить это значение в виде строки.
1 Gloom
 
15.12.04
16:20
Прямо в запросе и конвертуй в строку...
2 Дяпти
 
15.12.04
16:21
Преобразовывай в запросе к типам, которые 1С понимает.
3 ДенисЧ
 
15.12.04
16:22
В запросе сделай Convert(varchar, FieldName1, 104)
4 Uho
 
15.12.04
16:22
Value1 = строка(Rs.Fields("FieldName1”).Value);
5 Omi1
 
15.12.04
16:24
спасибо 1,2,3
Придется переписывать запрос :-(
6 Uho
 
15.12.04
16:27
(5) А чего (4) не катит? Сам не пробовал, просто интересно...
7 Omi1
 
15.12.04
16:30
(4) не катит
8 ДенисЧ
 
15.12.04
16:37
(5) дофига там переписывать...
(6) АДО не понимает типа datetime
9 Gloom
 
15.12.04
16:40
(8)"АДО не понимает типа datetime" - смелое заявление...
10 Uho
 
15.12.04
16:41
(8) А... Понятно, я просто через SQLDMO когда-то делал, поэтому типа (4) работало...
11 Omi1
 
15.12.04
16:42
(8) на самом деле немного но хотелось узнать возможно ли вообще такое
если через SQL-DMO
 то там есть GetColumnString
но для его работы нужен установленный клиент SQL
12 ДенисЧ
 
15.12.04
16:57
(9) нне понимает, не понимает :-)))
АДО знает только базовые типы: числа, строки
13 Gloom
 
15.12.04
16:59
(12)Где траву брал?
14 ДенисЧ
 
15.12.04
17:06
(13) Уже не помню. НО! помню, что стобы вернуть из запроса дату, пришлось извращаться с преобразованием.
ЗЫ. Если считаешь, что я не прав, приведи _работающий_ пример
15 Uho
 
15.12.04
17:06
Кажись, вы разговариваете про разные вещи:
кто-то про тип поля datetime, кто-то про timestamp.
Кстати, если тип поля FieldName1 - datatime, то (4) работает
16 Дяпти
 
15.12.04
17:07
Наверна нада было просто время от datetime оторвать и усе бы заработало.
17 Uho
 
15.12.04
17:09
+15 datatime читать как datetime
18 Gloom
 
15.12.04
17:12
(14)Ты перепутал ADO и 1цэ.
(15)timestamp - в ADO это adDBTimeStamp, возвращается сервером в двоичном виде, поэтому 1цэ от него и колбасит...
19 Uho
 
15.12.04
17:16
Перем CN,RS;
//*******************************************
Функция ПреобразоватьДатуВ1С(ДатаSQL)
  Дата1С=Дата(Число(Лев(ДатаSQL,4)),Число(Сред(ДатаSQL,6,2)),Число(Сред(ДатаSQL,9,2)));
  Возврат Дата1С;
КонецФункции
//*******************************************
Процедура РабочийПример()
  
  CN.Open();
  QR = "select orderdate from orders";
  RS = CN.Execute(QR);
  Если RS.EOF() = 0 Тогда
    ДатаВ1С=ПреобразоватьДатуВ1С(Строка(RS.Fields("orderdate").Value));
  КонецЕсли;
  CN.Close();
  
КонецПроцедуры
CN = СоздатьОбъект("ADODB.Connection");
RS = СоздатьОбъект("ADODB.RecordSet");
CN.ConnectionString = "Driver={SQL Server};Server=****;Database=northwind";
CN.ConnectionTimeOut = 15;
CN.CursorLocation = 3;
  
Повторяюсь: Если тип значения поля - datetime
20 Uho
 
15.12.04
17:18
+19 Это к (14)
(18)Сам уже все проверил, действительно так.
21 Gloom
 
15.12.04
17:29
Вот примерчик для ADO+timestamp+1цэ:
===============
    cnn=CreateObject("adodb.connection");
    cnn.open("TestCarlineDB");
    rst=cnn.ехесute
    (
    "set nocount on
    |create table #test_timestamp (f1 char(1), f2 timestamp)
    |insert into #test_timestamp values ('x', null)
    |select f1, f2, convert(varchar(25), cast(f2 as datetime),121) conv_f2 from #test_timestamp"
    );
    Сообщить(rst.fields("conv_f2").value);
Программист всегда исправляет последнюю ошибку.