情形:
我有一个记录001234的数据库,我用cmd.executescaler();
将其称为int
变量。问题是当我从该变量中检索保存的数据(001234
)时,它只提供1234
。 00
中的001234
很重要,这是第一次出现在db中的问题,其中sql省略了第一个零,然后我将数据类型更改为nvarchar,这是有效的,我如何才能正确检索表单上的数据{{ 1}}。
注意:我不能将数据转换为字符串,因为我还必须对它们应用一些计算。
使用Sql Server visual studio 2010 c#
希望很明显不含糊。如果您需要更多信息告诉我。 提前谢谢。
答案 0 :(得分:4)
数字数据类型没有,也不能有前导零。因此,使用前导零的唯一方法是将值存储为字符串。
但是,这只是格式化显示给用户的输出的问题。您可以将数据库值读入int
变量,进行计算,并在显示值时执行以下操作:
string displayValue = String.Format("{0:D6}", intValue);
并显示displayValue
的值。
答案 1 :(得分:1)
如果您想在代码方面工作:
string displayValue = String.Format("{0:D6}", intValue);
如果你想在数据库端工作,你需要一个允许编写这种查询的 Pad功能:
SELECT dbo.PadString ('8', '0', 5)
->Result: 00008
SELECT dbo.PadString ('abc', '*', 12)
->Result: *********abc
SELECT dbo.PadString ('abc', '0', 7)
->Result: 0000abc
在T-SQL中创建一个函数
CREATE FUNCTION [dbo].[PadString]
(@Seq varchar(16),
@PadWith char(1),
@PadLength int
)
RETURNS varchar(16) AS
BEGIN
declare @curSeq varchar(16)
SELECT @curSeq = ISNULL(REPLICATE(@PadWith, @PadLength - len(ISNULL(@Seq ,0))), '') + @Seq
RETURN @curSeq
END
答案 2 :(得分:0)
SQL这样做的原因是因为001234 = 1234,无论是什么类型,都是任何数字格式。作为一个“脏”的解决方案,你可以把它作为一个int,它会给你1234,执行你的claculations然后把你的答案转回字符串添加前导零。
int myValue = Int32.Parse("001234");
int myAnswer = myValue * 2;
string myAnswerString = "00" + myAnswer.ToString();
最好的方法是按照@Thorsten Dittmar的建议格式化你的字符串。如果可能的话,不要将数值作为varchar存储在db中,但我知道这有时是一个要求,但是我无法看到对这些值进行计算的重点。
由于 Ĵ
答案 3 :(得分:0)
如果那些前导零有一些含义并且不能被遗漏,则可以进行转换:
int number = 0;
string strNumber = (string)cmd.ExecuteScalar();
if(int.TryParse(strNumber, out number))
{
// process number
// if you want some output to be formatted with leading
// zeros you can use PadLeft method
int totalNumberOfDigits = 6;
string strResult = number.ToString().PadLeft(totalNumberOfDigits, '0');
}
答案 4 :(得分:0)
你可以在检索你的号码后在c#中使用string.PadLeft(),因为你有固定的长度数字
来自msdn的例子,
string str = "forty-two";
char pad = '.';
Console.WriteLine(str.PadLeft(15, pad)); // Displays "......forty-two".
Console.WriteLine(str.PadLeft(2, pad)); // Displays "forty-two".