2010-01-27 12 views
1

J'essaie de stocker et de récupérer un int64 non signé à l'aide de Microsoft SQL Server (et finalement d'utiliser ADO.NET EF), mais j'ai des problèmes. Comme vous ne pouvez pas spécifier une colonne entière comme non signée dans SQL Server, j'ai essayé d'utiliser binary (8), mais cela ne fonctionne pas comme prévu. Les requêtes suivantes donnent lieu à une valeur inattendue (0x03E8000000000000 et 281474976710656000):Utilisation d'un BIGINT non signé dans SQL Server

UPDATE table SET uint64 = 0x3E8 
SELECT uint64, cast(uint64 as bigint) FROM table 

Si je lance ce qui suit, cependant, il semble fonctionner OK (retour 0x00000000000003E8, 1000):

UPDATE table SET uint64 = 1000 
SELECT uint64, cast(uint64 as bigint) FROM table 

Malheureusement , le SQL créé par Entity Framework semble exécuter la première instruction de mise à jour (j'utilise BitConverter.ToBytes() lors de la conversion de ma variable ulong).

Est-ce ma meilleure option si je veux stocker un entier 64 bits non signé dans SQL Server? Y a-t-il une meilleure option que d'utiliser BitConverter (autre que d'écrire le mien pour trier le tableau LPAD avec le nombre approprié de zéros)?

Répondre

1

Je voudrais au moins regarder les champs varbinary, car vous aurez beaucoup de ces types de problèmes avec unsigned/signed dans un BIGINT.

+0

Je ne suis pas en utilisant le type de données BIGINT .. J'utilise binary (8). Quelle est la différence entre binary et varbinary? – Langdon

+0

Euh, je suppose que je peux Google cela. varbinary (8) semble fonctionner correctement et n'a pas le même comportement. Merci! – Langdon

3

Vous pouvez utiliser décimal (p, 0) et une contrainte de vérification pour assurer> = 0.

Choisissez p être assez grand pour vos entiers positifs

Questions connexes