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. |