我需要在数据库中存储一个CARD ID号。因此,不计算只搜索ID并将Session中的值作为属性放在类中。
ID始终是数字,它是12个位置。 例如123456789012,我想以这种格式在屏幕上显示。 123.456.789.012(每3位数一个点)。
我尝试了一个测试并在数据库中定义了Decimal(12,0)并将此值放在数据库中:555666777888
然后我尝试在屏幕上显示我使用此代码(CardID是十进制):
lblCardID.Text = ent.CardID.ToString("0:#,###")
但它在屏幕上显示如下: 555,666,77:7,888
冒号(:)来自哪里?
附加问题: - MS SQL中应使用哪种类型将此值存储在数据库中。十进制(12,0)或Nvarchar(12)?
答案 0 :(得分:4)
nvarchar
。如果它总是12位数,char(12)
就可以了,但我认为64位整数是最合适的。
答案 1 :(得分:3)
尝试写作
lblCardID.Text = ent.CardID.ToString("#,###")
您可以使用decimal(12,0)
或bigint
数据类型。 bigint
每个存储值需要少一个字节(总共8个字节)。
答案 2 :(得分:2)
冒号来自格式字符串中的冒号。使用string.Format()时,需要格式字符串开头的“0:”作为占位符来标识要格式化的参数,但是如果使用ToString()则不需要(因为只有一个价值被格式化。)
答案 3 :(得分:1)
我会使用bigint
,因为每个值只需要8个字节。
decimal(12,0)
需要9个字节,varchar
或nvarchar
需要更多(存储12位数时分别为12或24个字节)。
较小的列大小使索引更小,这使得索引的使用更快。
格式化数字可以在应用程序中完成。 如果需求发生变化,在应用程序中更改格式也会容易得多。
答案 4 :(得分:0)
如果您需要存储格式,并且它只是一个数值,请使用varchar,不要浪费时间使用nvarchar,因为它会增加您的存储空间并且除非您期望特殊(国际)字符,否则对您没有任何好处
答案 5 :(得分:0)
如果永远不会计算,我会将其存储为char(12)。
然后在你的代码中,用这样的东西拆分它并使用replace函数将逗号转换为点:
lblCardID.Text = ent.CardID.ToString("#,###").Replace(",", ".")
答案 6 :(得分:0)
如果它是一个ID号将它存储为一个字符串数据类型,你就不会对它进行总结,你也不会有丢失任何前导零的问题。然后,您还可以使用嵌入的点存储卡ID,以解决格式问题。
答案 7 :(得分:0)
除了由数字组成之外,您的标识符域是否具有主题属性?如果没有,则您的值是固定宽度,因此请使用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]%)')
);