какой тип должен использовать для хранения 12-значного значения я должен использовать десятичную или nvarchar в базе данных SQL? - PullRequest
3 голосов
/ 20 сентября 2011

Мне нужно сохранить идентификационный номер карты в базе данных.Таким образом, нет вычисления, только поиск идентификатора и помещение значения в Session в качестве свойства в классе.

Идентификатор is всегда числовой и имеет 12 позиций.например 123456789012 и я хотел бы показать на экране в этом формате.123.456.789.012 (каждые 3 цифры точка).

Я попытался проверить и определил десятичное число (12,0) в базе данных, и я поместил это значение в базу данных: 555666777888

, затем я пытаюсьчтобы отобразить на экране я использовал этот код (CardID является десятичным):

  lblCardID.Text = ent.CardID.ToString("0:#,###")

, но на экране это выглядит так: 555,666,77: 7,888

откуда взято двоеточие (:) ?

вопрос дополнительный: - Какой тип должен использоваться в MS SQL для хранения этого значения в базе данных.Десятичный (12,0) или Нварчар (12)?

Ответы [ 8 ]

4 голосов
/ 20 сентября 2011

nvarchar определенно не нужен. если это всегда 12 цифр, char(12) было бы хорошо, но я думаю, что 64-разрядное целое число было бы наиболее подходящим.

3 голосов
/ 20 сентября 2011

Попробуйте написать

lblCardID.Text = ent.CardID.ToString("#,###")

Вы можете использовать тип данных decimal(12,0) или bigint.bigint требует на один байт меньше (всего 8 байт) на каждое сохраненное значение.

2 голосов
/ 20 сентября 2011

Двоеточие идет от двоеточия в строке формата.«0:» в начале строки форматирования требуется, когда вы используете string.Format (), в качестве заполнителя для определения того, какой из аргументов необходимо отформатировать, но не если вы используете ToString () (поскольку имеется только одинзначение форматируется).

1 голос
/ 20 сентября 2011

Я бы использовал bigint, потому что для каждого значения требуется всего 8 байтов.

decimal(12,0) требуется 9 байтов и varchar или nvarchar еще больше (12 или 24 байта соответственно в случае сохранения 12 цифр).

Меньший столбецsize делает индексы меньшими, что ускоряет их использование.

Форматирование чисел можно выполнить в приложении.Также намного проще изменить форматирование в приложении в случае изменения требований.

0 голосов
/ 20 сентября 2011

Имеет ли домен вашего идентификатора математические свойства, кроме того, что он состоит из цифр?Если нет, то ваше значение равно фиксированной ширине, поэтому используйте CHAR(12).Не забудьте добавить соответствующие проверки домена (без символов, кроме цифр, без начального нуля и т. Д.), Например

CREATE TABLE Cards 
(
 card_ID CHAR(12) NOT NULL
    UNIQUE
    CONSTRAINT card_ID__all_digits 
       CHECK (card_ID NOT LIKE '%[^0-9]%'), 
    CONSTRAINT card_ID__no_leading_zero
       CHECK (card_ID NOT LIKE '[1-9]%)')
);
0 голосов
/ 20 сентября 2011

Если это идентификационный номер, сохраните его как строковый тип данных, вы не будете делать с ним суммы, у вас также не будет проблем с потерей лидирующих нулей.Вы также можете сохранить идентификатор карты со встроенными точками, решив проблемы с форматированием.

0 голосов
/ 20 сентября 2011

Если он никогда не будет рассчитан, я бы сохранил его как char (12).

Затем в вашем коде разделите его на что-то вроде этого и используйте функцию замены для преобразования запятых в точки:

lblCardID.Text = ent.CardID.ToString("#,###").Replace(",", ".")

0 голосов
/ 20 сентября 2011

Если вам нужно сохранить форматирование, а это всего лишь числовое значение, используйте varchar, не тратьте время на nvarchar, так как это увеличивает размер вашего хранилища и не принесет вам пользы, если вы не ожидаете специальных (международных) символов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...