Может ли T-SQL хранить улонг?

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

Есть ли способ сделать это? Или ловить OverflowException мою единственную надежду?

Ответы

Ответ 1

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

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

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

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

...

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

Ответ 2

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

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

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

Ответ 3

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

То, что сработало в конце, было просто

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

(без unchecked).

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

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