SQL Server 2005: definiowanie własnego typu
RAM - 19-07-2006 00:45
SQL Server 2005: definiowanie własnego typu
Napisałem w .NET własny typ (pniżej) którego chciałbym używać w SQLServerze.
[Serializable] [StructLayout(LayoutKind.Sequential)] [SqlUserDefinedType(Format.Native, Name="Płeć")] public class Płeć : INullable { SqlBoolean płeć; public Płeć() { płeć = SqlBoolean.Null; } public Płeć(SqlString s) { płeć = SqlBoolean.Null; if (s != null && !s.IsNull) { char[] mk = s.ToString().Substring(0, 1).ToLower().ToCharArray (); if (mk[0] == 'm' || mk[0] == 'k') { płeć = (mk[0] == 'm'); } } } public override string ToString() { if (płeć.IsNull) return "NULL"; return płeć.ToString(); } public bool IsNull { get { return płeć.IsNull; } } public static Płeć Null { get { return new Płeć(); } } public static Płeć Parse(SqlString s) { if (s == null || s.IsNull || s.Value.ToLower() == "null") return Null; Płeć p = new Płeć(s.ToString()); return p; } public SqlString Value { get { if (płeć.IsNull) return "NULL"; return (płeć ? "m" : "k"); } set { char[] mk = value.ToString().Substring(0, 1).ToLower ().ToCharArray(); if (mk[0] == 'm' || mk[0] == 'k') płeć = (mk[0] == 'm'); else throw new ArgumentException("Dozwolone wartości to 'm' i 'k'"); } } }
Następnie dodałem assembly do bazy DemoSQLServer i utworzyłem typ: CREATE TYPE Płeć EXTERNAL NAME [DemoSQLServer].[DemoSQLServer.Płeć]
Problem pojawił się gdy chciałem użyć mojego typu: DECLARE @mk Płeć SET @mk.Value = 'k' Błąd: Mutator 'Value' on '@mk' cannot be called on a null value. Nie rozumiem przyczyny tego komunikatu. Czy możecie mi proszę pomóc to poprawić? Bardzo dziękuję /RAM/
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
RAM - 19-07-2006 00:45
> Problem pojawił się gdy chciałem użyć mojego typu: > DECLARE @mk Płeć Już wiem: SET @mk = 'k'
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
RAM - 21-07-2006 01:18
Poprawiłem definicję metody ToString():
public override string ToString() { if (płeć.IsNull) return "NULL"; return (płeć ? "m" : "k"); }
Niestety dla zapytania:
DECLARE @mk Płeć SET @mk = 'k' SELECT CONVERT(nvarchar, @mk)
zwraca się NULL a nie 'k'. Możecie mi podpowiedzieć dlaczego? Jak to napisać? Dziękuję /RAM/
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
=?ISO-8859-2?Q?k=B3opot_z_uruchomieniem_MY_SQL_dla_C?==?ISO-8859-2?Q?MS_i_CRM_na_Fedora_Core_3?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
[newbie] MS SQL - praca =?ISO-8859-2?Q?jednocze=B6nie_na_2_?==?ISO-8859-2?Q?bazach_=28linkowanie_=3F=29?=
[oracle] - Oracle SQL Developer - co to jest SID?
[MS SQL + kontakty outlook]CZy kontakty moge być zewnętrzne?
zanotowane.pldoc.pisz.plpdf.pisz.plred-hacjenda.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|