0

场景:
我有一个记录为 001234 的数据库,我将其调用cmd.executescaler();为一个int变量。问题是当我001234从它只提供的变量中检索保存的数据 () 数据时123400很重要,这是首先出现在 db中001234的问题,其中 sql 省略了第一个零,然后我将数据类型更改为 nvarchar ,它可以正常工作,我如何才能准确地检索表单上的数据001234

注意:我不能将数据转换为字符串,因为我还必须对它们进行一些计算。

使用 Sql Server Visual Studio 2010 C#

希望它是清楚的而不是模糊的。如果您需要更多信息,请告诉我。提前致谢。

4

5 回答 5

4

数字数据类型没有也不能有前导零。因此,拥有前导零的唯一方法是将值存储为字符串。

但是,这只是格式化显示给用户的输出的问题。您可以将数据库值读入int变量,进行计算,并在显示值时执行以下操作:

string displayValue = String.Format("{0:D6}", intValue);

并显示 的值displayValue

于 2012-06-04T09:16:12.580 回答
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
于 2012-06-04T09:20:56.317 回答
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".
于 2012-06-04T10:03:58.613 回答
0

SQL 这样做的原因是因为 001234 = 1234 任何数字格式,无论它是什么类型。作为“脏”解决方案,您可以将其转换为 int,它将为您提供 1234,执行您的计算,然后将您的答案转换回添加前导零的字符串。

int myValue = Int32.Parse("001234");
int myAnswer = myValue * 2;

string myAnswerString = "00" + myAnswer.ToString();

最好的方法是按照@Thorsten Dittmar 的建议格式化您的字符串。如果可能的话,不要将数据库中的数值存储为 varchar,但是我知道这有时是一个要求,但我看不出对这些值进行计算的意义。

于 2012-06-04T09:22:09.527 回答
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');
            }
于 2012-06-04T09:25:15.013 回答