Конференция "Базы" » MSSQL2008: использование типа date через ADODB
 
  • Тимохов Дима © (09.10.18 16:39) [0]
    Приветствую!

    1. Всегда пользовался типом smalldatetime. При этом надо было хранить только даты (без времени). В MSSQL2008 наконец появился тип date. Решил перейти на него. Но обнаружились проблемы при получении в Delphi через ADODB значений типа date.

    2. Проблема выглядит так, что полученное значение типа date имеет вариантный тип varOleStr (представляет дату в виде '2018-01-01'), а не varDate.

    3. Порывшись в интернете, нашел такую фразу:
    However, in order to improve portability, the default behaviour of the ADOdb mssqlnative driver is to return the date as a string:
    (здесь http://adodb.org/dokuwiki/doku.php?id=v5:database:microsoft_sql_server)

    Как совет: задать свойство подключения ReturnDatesAsStrings=false.

    Но! В примере используется драйвер mssqlnative.
    Я же в ADODB.Connection параметрах передаю строку: Provider=SQLOLEDB...
    Не пойму, куда приладить этот mssqlnative.

    Для SQLOLEDB параметр ReturnDatesAsStrings игнорируется.

    4. Вопрос - как заставить ADODB возвращать поля типа date в виде varDate, а не varOleStr?

    Спасибо!
  • sniknik © (09.10.18 18:41) [1]
    > Не пойму, куда приладить этот mssqlnative.
    это вообще не к дельфи относится, это похоже к NET и для "переносимости" - винда vs линух.

    > 4. Вопрос - как заставить ADODB возвращать поля типа date в виде varDate, а не varOleStr?
    не надо заставлять, всегда он возвращался в типе дататайм, что дата что время что время с датой... начиная с 2000го года и mssql сервера как минимум. как раз когда начал с mssql работать (за 7ку не скажу, слишком мало с ней "общался", просто не помню... хотя с чего ей отличатся?)
  • sniknik © (09.10.18 18:46) [2]
    вот кстати тема по CONVERT от 2000го года
    http://www.sql.ru/forum/685/kak-izmenit-format-daty?hl=convert
    а вот таблица совместимости для нее
    https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/media/lrdatahd.png?view=sql-server-2017
    не менялась с тех пор (проверить - поставить 2000й и посмотреть в его справке)
    тип date есть...
    с чего решил что только
    > В MSSQL2008 наконец появился тип date.
    ???
  • Тимохов Дима © (09.10.18 19:12) [3]

    > sniknik ©   (09.10.18 18:46) [2]


    1. В MSSQL2000 не было типа date (был datetime и smalldatetime).
    Набери в гугле "new data types in mssql 2008" и увидишь, что date - именно *новый* тип.

    2. Вот такое код, будучи выполненным через TADOQuery
    declare @t table(d date, sdt smalldatetime)
    insert @t values(cast('20181020' as date), cast('20181020' as date))
    select d, sdt from @t


    возвращает в поле "d" строку '2008-10-20', а не вариантное значение типа varDate, тогда как в поле "sdt" возвращается именно varDate.
    В этом и вопрос - как заставить ADODB тип date возвращать как varDate.
  • Тимохов Дима © (09.10.18 19:23) [4]

    > sniknik ©   (09.10.18 18:46) [2]

    Так, на всякий случай - проверил, что использую версию AdoDb: 6.1 C:\Program Files (x86)\Common Files\System\ado\msado15.dll
    Вроде как это последняя версия.
  • Тимохов Дима © (09.10.18 20:00) [5]

    > sniknik ©   (09.10.18 18:41) [1]


    Интересно... попробовал такую строку подключения

    Provider=SQLNCLI11.1;Integrated Security=SSPI;Persist Security Info=False;User ID="""""";Initial Catalog=mytestdb;Data Source=.;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=TIM-10;Initial File Name="";Use Encryption for Data=False;Tag with column collation when possible=False;MARS Connection=False;DataTypeCompatibility=0;Trust Server Certificate=False;Application Intent=READWRITE;

    и все ОК - date возвращается как varDate.

    Видимо, SQLOLEDB слишком старый, а SQLNCLI11.1 лучше.

    Сам каким провайдером пользуешься для SQL2008?
  • sniknik © (10.10.18 08:15) [6]
    > 1. В MSSQL2000 не было типа date (был datetime и smalldatetime).
    возможно... всегда пользовался датетаймом. скорее всего пропустил/было не интересно проигнорировал и забыл новшество.

    > Видимо, SQLOLEDB слишком старый, а SQLNCLI11.1 лучше.
    SQLOLEDB идет по умолчанию в винде, SQLNCLI11.1 нужно ставить... если первого достаточно (не отключена авторизация "по старому" на сервере) то "лучший" нафиг не нужен.

    > Сам каким провайдером пользуешься для SQL2008?
    все равно, какой админы настроят в проге, таким и пользуюсь... скорее всего обоими для разных баз. надо смотреть настройки.
  • Тимохов Дима © (10.10.18 11:24) [7]

    > sniknik ©   (10.10.18 08:15) [6]

    Попробовал SQLNCLI11.1. Не все работает - какая-то несовместимость есть по  типу datetime2 и int. Надо разобраться. Но субъективно он чуть шустрее.

    Такое ощущение, что весь мир проигнорировал новый тип date (а он все же 3 байта, а не 4 как в smalldatetime). Нигде вопроса про возврат date как varOleStr не видел...
  • sniknik © (10.10.18 14:59) [8]
    > Такое ощущение, что весь мир проигнорировал новый тип date
    ну в общем то да, мне лично всегда хватало обычного datetime, ни за лишний байт, ни за повышенную точность никогда "не боролся". всему миру похоже так же пофиг.
  • Тимохов Дима © (10.10.18 22:47) [9]

    > sniknik ©   (10.10.18 14:59) [8]

    Может знаешь какой-нибудь крутой ресурс по MSSQL+ADODB? Форумы?
    Русский, английский - не важно.
  • sniknik © (11.10.18 18:19) [10]
    если стоит офис(или частично, провайдер мелкософта например... х.з. куда он входит, у меня всегда был) то посмотри справку -
    C:\Program Files\Common Files\microsoft shared\OFFICE16\1049\ADO210.CHM
    этот файл был самым полезным при изучении ado для меня.
  • Тимохов Дима © (11.10.18 20:55) [11]
    Нашелся. Спасибо!
  • Читатель © (06.11.18 13:16) [12]
 
Конференция "Базы" » MSSQL2008: использование типа date через ADODB
Есть новые Нет новых   [134427   +26][b:0][p:0.001]