Может ли T-SQL хранить ULONG? - PullRequest
14 голосов
/ 02 июня 2010

Я хочу сохранить C # .NET ulong в базе данных T-SQL. Я не вижу каких-либо условий для этого, поскольку SQL bigint имеет те же значения Min / Max, что и обычные long.

Есть ли способ, которым я могу это сделать? Или поймать OverflowException моя единственная надежда?

Ответы [ 3 ]

9 голосов
/ 02 июня 2010

Это должно ответить на ваш вопрос:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/ff08c190-a981-4896-9542-3f64b95a84a2/

Вы бы использовали BigInt, вам просто нужно быть осторожным в том, как вы конвертируете подписанный тип обратно в беззнаковый тип в C #

// This has not been tested
unchecked
{
    myUlong = myDataReader.GetInt64(...);
}

...

Другая возможность - использовать VarBinary длиной 8, а затем преобразовать байты в ulong в C #

6 голосов
/ 02 июня 2010

Я знаю, что это не то же самое, но будет ли это:

select convert(decimal(38, 0), 12345678901234567890123456789012345678)

Максимум для неподписанного длинного составляет 18 446 744 073 709 551 615, что значительно меньше, чем это десятичное число. Могут быть проблемы с конвертированием, но я уверен, что пара функций-обёрток в вашем приложении довольно быстро их отсортирует.

0 голосов
/ 23 января 2019

Для меня решение Нила Н не сработало.Visual Studio постоянно жаловалась, что я не могу присвоить значение long переменной ulong, независимо от того, unchecked.

То, что в итоге сработало, было просто

ulong fileSize = (ulong)(long)reader["fileSize"];

(без unchecked).

В БД SQLite значение сохраняется как long, поэтому очень высокие значения становятся отрицательными, и сортировка их на стороне SQL не выполняется.Но после получения значений ulong Linq может творить чудеса

items = items.OrderByDescending(x => x.FileSize).ToList();
...