Megosztás a következőn keresztül:


Felhasználó által definiált típusra (UDT) vonatkozó követelmények

A következőkre vonatkozik:SQL Server

A felhasználó által definiált típus (UDT) létrehozásakor számos fontos tervezési döntést kell meghoznia az SQL Serveren való telepítéshez. A legtöbb UDT esetében ajánlott az UDT struktúraként való létrehozása, bár az osztályként való létrehozása is lehetőség. Az UDT-definíciónak meg kell felelnie az UDT-k létrehozásának specifikációinak ahhoz, hogy regisztrálva legyen az SQL Serveren.

Az UDT-k implementálásának követelményei

Az SQL Serveren való futtatáshoz az UDT-nek az alábbi követelményeket kell megvalósítania az UDT-definícióban:

Az UDT-nek meg kell adnia a Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute. A System.SerializableAttribute használata nem kötelező, de ajánlott.

  • Az UDT-nek egy nyilvános static (a Visual BasicbenShared) Null metódus létrehozásával kell implementálnia az osztály vagy a struktúra System.Data.SqlTypes.INullable felületét. Az SQL Server alapértelmezés szerint nullérzékeny. Ez azért szükséges, hogy az UDT-ben futtatott kód felismerjen egy null értéket.

  • Az UDT-nek tartalmaznia kell egy nyilvános static (vagy Shared) Parse metódust, amely támogatja az elemzést, valamint egy nyilvános ToString metódust az objektum sztring-ábrázolására való konvertáláshoz.

  • A felhasználó által definiált szerializálási formátummal rendelkező UDT-nek implementálnia kell a System.Data.IBinarySerialize felületet, és meg kell adnia egy Read és egy Write metódust.

  • Az UDT-nek implementálnia kell System.Xml.Serialization.IXmlSerializable, vagy az összes nyilvános mezőnek és tulajdonságnak XML-szerializálható vagy XmlIgnore attribútummal ellátott típusúnak kell lennie, ha felül kell bírálni a szabványos szerializálást.

  • Csak egy UDT-objektum szerializálása lehet. Az ellenőrzés sikertelen, ha a szerializálási vagy deszerializálási rutinok egy adott objektum több ábrázolását is felismerik.

  • SqlUserDefinedTypeAttribute.IsByteOrdered true kell lennie az adatok bájtsorrendben való összehasonlításához. Ha a IComparable felület nincs implementálva, és SqlUserDefinedTypeAttribute.IsByteOrderedfalse, a bájtsorrendek összehasonlítása sikertelen.

  • Az osztályban definiált UDT-nek olyan nyilvános konstruktorsal kell rendelkeznie, amely nem vesz fel argumentumokat. Igény szerint több túlterhelt osztálykonstruktort is létrehozhat.

  • Az UDT-nek nyilvános mezőként vagy tulajdonságeljárásként kell elérhetővé tennie az adatelemeket.

  • A nyilvános nevek nem lehetnek hosszabbak 128 karakternél, és meg kell felelniük a adatbázis-azonosítókmeghatározott azonosítók SQL Server-elnevezési szabályainak.

  • sql_variant oszlopok nem tartalmazhatnak UDT-példányokat.

  • Az örökölt tagok nem érhetők el Transact-SQL, mert az SQL Server-típusrendszer nem ismeri az UDT-k öröklési hierarchiáját. Az osztályok strukturálásakor azonban használhat öröklést, és az ilyen metódusokat meghívhatja a típus felügyelt kód implementációjában.

  • A tagok nem terhelhetők túl, kivéve az osztálykonstruktort. Ha túlterhelt metódust hoz létre, a rendszer nem okoz hibát a szerelvény regisztrálásakor vagy a típus SQL Serverben való létrehozásakor. A túlterhelt metódus észlelése futásidőben történik, nem a típus létrehozásakor. A túlterhelt metódusok mindaddig létezhetnek az osztályban, amíg soha nem hívják meg őket. A túlterhelt metódus meghívása után hiba jelenik meg.

  • Minden static (vagy Shared) tagot állandóként vagy írásvédettként kell deklarálni. A statikus tagok nem lehetnek módosíthatók.

  • Ha a SqlUserDefinedTypeAttribute.MaxByteSize mező -1értékre van állítva, a szerializált UDT mérete akkora lehet, mint a nagy objektum (LOB) méretkorlátja (jelenleg 2 GB). Az UDT mérete nem haladhatja meg a MaxByteSized mezőben megadott értéket.

Jegyzet

Bár a kiszolgáló nem használja összehasonlításokhoz, igény szerint implementálhatja a System.IComparable felületet, amely egyetlen metódust tesz elérhetővé, CompareTo. Ezt az ügyféloldalon használják olyan helyzetekben, amikor az UDT-értékek pontos összehasonlítása vagy sorrendje kívánatos.

Natív szerializálás

Az UDT megfelelő szerializálási attribútumainak kiválasztása a létrehozni kívánt UDT típusától függ. A Native szerializálási formátum egy egyszerű struktúrát használ, amely lehetővé teszi, hogy az SQL Server az UDT hatékony natív ábrázolását tárolja a lemezen. A Native formátum akkor ajánlott, ha az UDT egyszerű, és csak a következő típusú mezőket tartalmazza:

bool, bájt, bájt, rövid, ushort, int, , hosszú, ulong, úszó, kettős, , , , , , , , ,

Az ilyen típusú mezőkből álló értéktípusok jó jelöltek Native formátumra, például struct C#-ban, vagy Structure a Visual Basic .NET-ben ismert módon. A Native szerializálási formátummal megadott UDT például tartalmazhat egy másik UDT-mezőt, amely szintén a Native formátummal lett megadva. Ha az UDT-definíció összetettebb, és az előző listában nem szereplő adattípusokat tartalmaz, a UserDefined szerializálási formátumot kell megadnia.

A Native formátumra a következő követelmények vonatkoznak:

  • A típus nem adhat meg értéket Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSize.

  • Minden mezőnek szerializálhatónak kell lennie.

  • A System.Runtime.InteropServices.StructLayoutAttributeStructLayout.LayoutKindSequential kell megadni, ha az UDT egy osztályban van definiálva, és nem struktúrában. Ez az attribútum szabályozza az adatmezők fizikai elrendezését, és arra szolgál, hogy a tagokat a megjelenésük sorrendjében határozzák meg. Az SQL Server ezzel az attribútummal határozza meg a több értékkel rendelkező UDT-k mezősorrendét.

Példa a Native szerializálással definiált UDT-ra, lásd a Point UDT-t Felhasználó által definiált típusok létrehozása ADO.NET.

UserDefined szerializálás

A Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute attribútum UserDefined formátumbeállítása teljes körű ellenőrzést biztosít a fejlesztő számára a bináris formátum felett. A Format attribútumtulajdonság UserDefinedként való megadásakor a következő műveleteket kell végrehajtania a kódban:

  • Adja meg a választható IsByteOrdered attribútumtulajdonságot. Az alapértelmezett érték a false.

  • Adja meg a Microsoft.SqlServer.Server.SqlUserDefinedTypeAttributeMaxByteSize tulajdonságát.

  • A System.Data.Sql.IBinarySerialize felület implementálásával kódot írhat az UDT Read és Write metódusainak implementálásához.

Példa a UserDefined szerializálással definiált UDT-ra: Felhasználó által definiált típusok létrehozása ADO.NET.

Jegyzet

Az UDT-mezőknek natív szerializálást kell használniuk, vagy meg kell őrizni őket az indexeléshez.

Szerializálási attribútumok

Az attribútumok határozzák meg, hogyan történik a szerializálás az UDT-k tárolási ábrázolásának létrehozásához és az UDT-k érték szerinti továbbításához az ügyfélnek. Az UDT létrehozásakor meg kell adnia a Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute. A Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute attribútum azt jelzi, hogy az osztály egy UDT, és megadja az UDT tárterületét. Igény szerint megadhatja a Serializable attribútumot, bár az SQL Serverhez nincs szükség erre.

A Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute a következő tulajdonságokkal rendelkezik.

Formátum

Megadja a szerializálási formátumot, amely az UDT adattípusától függően Native vagy UserDefinedlehet.

IsByteOrdered

Egy Boolean érték, amely meghatározza, hogy az SQL Server hogyan hajtja végre a bináris összehasonlításokat az UDT-n.

IsFixedLength

Azt jelzi, hogy az UDT összes példánya azonos hosszúságú-e.

MaxByteSize

A példány maximális mérete bájtban. Meg kell adnia MaxByteSize a UserDefined szerializálási formátumot. Felhasználó által definiált szerializálást tartalmazó UDT esetén MaxByteSize a felhasználó által meghatározott szerializált formában az UDT teljes méretére hivatkozik. A MaxByteSize értékének a 80001 tartományában kell lennie, vagy -1 értékre kell állítania, hogy jelezze, hogy az UDT nagyobb, mint 8000 bájt (a teljes méret nem haladhatja meg a maximális LOB-méretet). Fontolja meg a 10 karakterből álló sztring (System.Char) tulajdonságú UDT-t. Ha az UDT bináris íróval szerializálva van, a szerializált sztring teljes mérete 22 bájt: Unicode UTF-16 karakterenként 2 bájt, megszorozva a karakterek maximális számával, valamint 2 vezérlőbájt a bináris adatfolyam szerializálásával járó többletterheléssel. Ezért a MaxByteSizeértékének meghatározásakor figyelembe kell venni a szerializált UDT teljes méretét: a bináris formában szerializált adatok méretét és a szerializálással járó többletterhelést.

ValidationMethodName

Az UDT példányainak ellenőrzésére használt metódus neve.

Az isbyteordered beállítása

Ha a Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered tulajdonság trueértékre van állítva, akkor garantálja, hogy a szerializált bináris adatok felhasználhatók az információk szemantikai sorrendbe helyezéséhez. Így egy bájtsorrendű UDT-objektum minden példánya csak egy szerializált ábrázolással rendelkezhet. Ha az SQL Serveren szerializált bájtokon végez összehasonlítási műveletet, az eredménynek meg kell egyeznie, mintha ugyanaz az összehasonlítási művelet történt volna a felügyelt kódban. Az alábbi funkciók akkor is támogatottak, ha IsByteOrderedtruevan beállítva:

  • Az ilyen típusú oszlopok indexeinek létrehozása.

  • Az elsődleges és idegen kulcsok, valamint az ilyen típusú oszlopokra vonatkozó CHECK és UNIQUE korlátozások létrehozásának lehetősége.

  • A Transact-SQL ORDER BY, GROUP BYés PARTITION BY záradékok használata. Ezekben az esetekben a típus bináris ábrázolása határozza meg a sorrendet.

  • Az összehasonlító operátorok használata Transact-SQL utasításokban.

  • Az ilyen típusú számított oszlopok megőrzése.

A Native és UserDefined szerializálási formátumok a következő összehasonlító operátorokat támogatják, ha IsByteOrderedtruevan beállítva:

  • Egyenlő (=)
  • Nem egyenlő (!=)
  • Nagyobb, mint (>)
  • Kisebb, mint (<)
  • Nagyobb vagy egyenlő (>=)
  • Kisebb vagy egyenlő (<=)

Nullability implementálása

A szerelvények attribútumainak helyes megadása mellett az osztálynak támogatnia kell a null értékűséget is. Az SQL Serverbe betöltött UDT-k nullérzékenyek, de ahhoz, hogy az UDT felismerjen egy null értéket, az osztálynak implementálnia kell a INullable felületet. További információkért és a nullitás UDT-ben való implementálásának példájáért lásd: Felhasználó által definiált típusok létrehozása ADO.NET.

Sztringkonvertálások

Az UDT-be való és azokból való sztringátalakítás támogatásához meg kell adnia egy Parse metódust és egy ToString metódust az osztályban. A Parse metódus lehetővé teszi, hogy a sztringek UDT-vé alakuljanak. Deklarálni kell static (vagy a Visual Basicben Shared), és egy System.Data.SqlTypes.SqlStringtípusú paramétert kell megadnia. További információkért és a Parse és ToString metódusok implementálásához lásd: Felhasználó által definiált típusok létrehozása ADO.NET.

XML-szerializálás

Az UDT-knek támogatniuk kell a xml adattípusra való konvertálást az XML-szerializálásra vonatkozó szerződésnek megfelelően. A System.Xml.Serialization névtér olyan osztályokat tartalmaz, amelyek az objektumok XML formátumú dokumentumokká vagy streamekké való szerializálására szolgálnak. A IXmlSerializable felülettel xml- szerializálás implementálható, amely egyéni formázást biztosít az XML-szerializáláshoz és deszerializáláshoz.

Az XML-szerializálás az UDT-ről xml-való explicit átalakításon kívül a következőket teszi lehetővé:

  • Az XQuery használata az UDT-példányok értékein a xml adattípusra való átalakítás után.

  • Használjon UDT-ket paraméteres lekérdezésekben és webes metódusokban natív XML Web Services használatával az SQL Serverben.

  • Az UDT-k használatával tömegesen fogadhatja az XML-adatokat.

  • Szerializálja az UDT-oszlopokkal rendelkező táblákat tartalmazó adathalmazokat.

Az UDT-k nincsenek szerializálva XML-lekérdezésekben. Az UDT-k XML-szerializálását megjelenítő XML-lekérdezés végrehajtásához az egyes UDT-oszlopokat explicit módon konvertálja az SELECT utasításban szereplő xml adattípusra. Az oszlopokat explicit módon átalakíthatja varbináris, varchar, vagy nvarchar.