Udostępnij za pośrednictwem


Konwersje z C SQL

W tym temacie opisano problemy, które należy rozważyć podczas konwersji z typu C, aby SQL Server Data /czas typów.

Konwersje opisane w poniższej tabela mają zastosowanie do konwersji na klient.W przypadkach, gdy klient określa ułamkowe precyzję drugi parametr, który różni się od zdefiniowanego na serwerze, może się powieść konwersji klienta, ale serwer zwróci błąd podczas SQLExecute lub SQLExecuteDirect jest wywoływana.W szczególności ODBC traktuje wszystkie obcinania ułamków sekund jako błąd, należy SQL Server jest zachowanie zaokrąglić; na przykład zaokrąglania występuje po przejściu od datetime2(6) do datetime2(2).DATETIME kolumna wartości są zaokrąglane do 1/300th, druga i smalldatetime kolumna mają sekund zestaw do zera przez serwer.

SQL_TYPE_DATE

SQL_TYPE_TIME

SQL_SS_TIME2

SQL_TYPE_TIMESTAMP

SQL_SS_TIMSTAMPOFFSET

SQL_CHAR

SQL_WCHAR

SQL_C_DATE

1

-

-

1,6

1,5,6

1,13

1,13

SQL_C_TIME

-

1

1

1,7

1,5,7

1,13

1,13

SQL_C_BINARY(SQL_SS_TIME2_STRUCT)

Brak

Brak

1,10,11

Brak

Brak

Brak

Brak

SQL_C_TYPE_TIMESTAMP

1,2

1,3,4

1,4,10

1,10

1,5,10

1,13

1,13

SQL_C_BINARY(SQL_SS_TIMESTAMPOFFSET_STRUCT)

Brak

Brak

Brak

Brak

1,10,11

Brak

Brak

SQL_C_CHAR/SQL_WCHAR (Data)

9

9

9

9,6

9,5,6

Brak

Brak

SQL_C_CHAR/SQL_WCHAR (time2)

9

9,3

9,10

9,7,10

9,5,7,10

Brak

Brak

SQL_C_CHAR/SQL_WCHAR (datetime)

9,2

9,3,4

9,4,10

9,10

9,5,10

Brak

Brak

SQL_C_CHAR/SQL_WCHAR (datetimeoffset)

9,2,8

9,3,4,8

9,4,8,10

9,8,10

9,10

Brak

Brak

SQL_C_BINARY(SQL_DATE_STRUCT)

1,11

Brak

Brak

Brak

Brak

Brak

Brak

SQL_C_BINARY(SQL_TIME_STRUCT)

Brak

Brak

Brak

Brak

Brak

Brak

Brak

SQL_C_BINARY(SQL_TIMESTAMP_STRUCT)

Brak

Brak

Brak

Brak

Brak

Brak

Brak

Klucz do symboli

Symbol

Znaczenie

-

Konwersja nie jest obsługiwane.Diagnostyczne rekord jest generowana z SQLSTATE 07006 i komunikat "ograniczonego typu danych atrybut".

1

Jeżeli dostarczone dane nie jest prawidłowy, diagnostyczne rekordu jest generowana z SQLSTATE 22007 i komunikat "datetime nieprawidłowy format".

2

Godzina musi mieć wartość zero lub diagnostycznych rekord jest generowana z SQLSTATE 22008 i komunikat "Przepełnienie pole typu Data/Godzina".

3

Ułamków sekund musi mieć wartość zero lub diagnostycznych rekord jest generowana z SQLSTATE 22008 i komunikat "Przepełnienie pole typu Data/Godzina".

4

Składnik data jest ignorowana.

5

Strefa czasowa jest ustawiona zestaw timezone klient.

6

Czas jest zestaw do zera.

7

Data jest zestaw do bieżącej daty.

8

Czas jest konwertowany od timezone klient UTC.Jeżeli błąd wystąpi podczas tej konwersji, diagnostyczne rekord jest generowana z SQLSTATE 22008 i komunikat "Przepełnienie pole typu Data/Godzina".

9

Analizowany ciąg i przekonwertowana na data, dataczas, dataczasprzesunięcie, lub czas wartości, w zależności od pierwszy znak interpunkcyjny napotkał i obecność pozostałe składniki.Ciąg jest następnie konwertowana na typ miejsce docelowe, następujących reguł w powyższej tabela dla typu źródło wykryte przez ten proces.Wykrycie błędu podczas analizowania danych diagnostycznych rekord jest generowana z SQLSTATE 22018 i komunikat "nieprawidłowy znak wartość dla specyfikacji".Parametrów typu Data/Godzina i smalldatetime, jeśli rok jest poza zakres obsługiwane przez te typy, diagnostyczne rekord jest generowana z SQLSTATE 22007 i komunikat "datetime nieprawidłowy format".

Dla datetimeoffset, wartość musi być w zakres po konwersji na UTC, nawet jeśli żądana bez konwersji na UTC.Wynika to TDS i serwer zawsze znormalizować czas w wartości datetimeoffset dla UTC, klient musi sprawdzić tego czasu składniki są w zakres obsługiwane po konwersji na UTC.Jeśli wartość nie jest obsługiwane zakres UTC diagnostyczne rekord jest generowana z SQLSTATE 22007 i komunikat "datetime nieprawidłowy format".

10

Jeśli nastąpi obcięcie utraty danych, diagnostyczne rekord jest generowana z SQLSTATE 22008 i komunikat "Przepełnienie pole typu Data/Godzina".Ten błąd występuje również, jeżeli wartość mieści się poza zakresem, który może być reprezentowany przez zakres UTC, używany przez serwer.

11

Jeśli długość bajtów danych nie jest równa wielkości struct wymagane przez typ SQL, diagnostyczne rekord zostanie wygenerowany z SQLSTATE 22003 i komunikat "Wartość numeryczna spoza zakres".

12

Jeśli długość bajtów danych jest 4 lub 8, dane są przesyłane do serwera w TDS smalldatetime lub datetime formacie raw.Jeśli długość bajtów danych dokładnie odpowiada rozmiarowi SQL_TIMESTAMP_STRUCT, dane są konwertowane na format TDS dla datetime2.

13

Jeśli nastąpi obcięcie utraty danych, diagnostyczne rekord jest generowany z SQLSTATE 22001 i komunikat "Dane ciągu" prawo obcięte.

Liczba cyfr ułamków sekund (skala) zależy od rozmiaru kolumna docelowej zgodnie z następujących tabela:

TypSkala wprost0Skala wprost1..9
SQL_C_TYPE_TIMESTAMP1921..29

Jednakże w przypadku SQL_C_TYPE_TIMESTAMP, jeśli ułamków sekund można przedstawić z trzech cyfr bez utraty danych i rozmiar kolumna jest 23 lub większym, a następnie dokładnie trzy ułamków sekund cyfry są generowane.To zachowanie wstecz gwarantuje zgodność aplikacji opracowane przy użyciu starszych sterowników ODBC.

Dla kolumna rozmiarach większych niż domniemanych zakres w tabela skalowania 9.Ta konwersja powinny umożliwić do dziewięciu cyfr ułamków sekund, maksymalną dozwoloną przez sterownik ODBC.

Rozmiar kolumna zero oznacza nieograniczoną rozmiar typów znaków o zmiennej długości ODBC (9 cyfr, chyba że stosowana reguła 3-cyfrowy dla SQL_C_TYPE_TIMESTAMP).Określanie rozmiaru kolumna zero z typem znak stałej długości jest błąd.

Brak

Istniejące SQL Server 2005 i starsze zachowanie jest utrzymywana.

Zobacz także

Koncepcje