C#DataRow.ToString()在字符串不应';T

C#DataRow.ToString()在字符串不应';T,c#,sql,sql-server,formatting,C#,Sql,Sql Server,Formatting,我已经编程一段时间了,但我从未见过这种情况发生,所以我有点困惑到底发生了什么。我所做的是在数据库上执行一个SP,只是为了在实际使用它之前测试它的输出,我将行放入以管道分隔的字符串中。出于某种原因,当我为这些结果设置文本框时,它会将SQL Server中的日期格式化为日期时间变量,并将1.99位小数格式化为1.9900位小数 还有一点需要注意:我不想通过按列名调用特定列来访问列数据。我想这样做,以便我可以更改并向数据库中的SP添加列,这将继续工作,并从SP返回所有列 另外,上一个日期时间的秒数也不

我已经编程一段时间了,但我从未见过这种情况发生,所以我有点困惑到底发生了什么。我所做的是在数据库上执行一个SP,只是为了在实际使用它之前测试它的输出,我将行放入以管道分隔的字符串中。出于某种原因,当我为这些结果设置文本框时,它会将SQL Server中的日期格式化为日期时间变量,并将1.99位小数格式化为1.9900位小数

还有一点需要注意:我不想通过按列名调用特定列来访问列数据。我想这样做,以便我可以更改并向数据库中的SP添加列,这将继续工作,并从SP返回所有列

另外,上一个日期时间的秒数也不一样,因为查询是在不同的时间运行的,所以不必担心这一点

有人知道这里发生了什么吗

以下是获取数据并创建管道分隔字符串的代码:

private string GetHourlySales()
{
    StringBuilder output = new StringBuilder();
    DataTable tblData = new DataTable();

    using (SqlConnection conn = new SqlConnection(GetConnectionString()))
    {
        string sql = "EXEC [dbo].[ryan_GetSalesSummary] 0";
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            try
            {
                conn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                tblData.Load(dr, LoadOption.Upsert);
                conn.Close();
            }
            catch (Exception) { }
        }
    }

    foreach (DataRow row in tblData.Rows)
    {
        for (int i = 0; i < tblData.Columns.Count; i++)
        {
            if (i > 0)
                output.Append("|");
            if (i == tblData.Columns.Count - 1)
                output.AppendLine(row[i].ToString());
            else
                output.Append(row[i].ToString());
        }
    }

    if (tblData.Rows.Count > 0)
        return output.ToString();
    else
        return null;
}
私有字符串GetHourlySales()
{
StringBuilder输出=新的StringBuilder();
DataTable tblData=新DataTable();
使用(SqlConnection conn=newsqlconnection(GetConnectionString()))
{
字符串sql=“EXEC[dbo].[ryan\u GetSalesSummary]0”;
使用(SqlCommand cmd=newsqlcommand(sql,conn))
{
尝试
{
conn.Open();
SqlDataReader dr=cmd.ExecuteReader();
tblData.Load(dr,LoadOption.Upsert);
康涅狄格州关闭();
}
捕获(异常){}
}
}
foreach(tblData.Rows中的数据行)
{
对于(int i=0;i0)
输出。追加(“|”);
if(i==tblData.Columns.Count-1)
output.AppendLine(行[i].ToString());
其他的
Append(行[i].ToString());
}
}
如果(tblData.Rows.Count>0)
返回output.ToString();
其他的
返回null;
}
以下是它创建的输出:

以下是我直接从SQL Server获得的信息:

您的数据表不包含您在查询数据库时看到的字符串,而是键入的,这意味着您拥有所选列的实际数据类型。因此,
DateTime
s将被格式化为
DateTime
s,而
Decimal
s将被格式化为
Decimal
s。您看到的是默认行为。

您的数据表不包含您在查询数据库时看到的字符串,而是类型化的,这意味着您拥有所选列的实际数据类型。因此,
DateTime
s将被格式化为
DateTime
s,而
Decimal
s将被格式化为
Decimal
s。您看到的是默认行为。

您在MSSQL manager中看到的只是数据的表示形式,与您的datatable是数据的表示形式相同。您在MSSQL manager中看到的只是数据的表示形式,与您的datatable是数据的表示形式相同。哦,好的。因此它实际上保留了SQL Server中的数据类型,并在C#中对该数据类型调用ToString()方法,从而将其格式化为默认字符串。对吗?对,对。它试图尽可能接近MSSQL数据类型。有时没有1:1的等价物,但对于您的示例,应该有。谢谢我认为它知道这是一个日期时间,因为它将其格式化为日期时间,但我不知道它如何或是否从SQL Server中保留了数据类型。我猜你每天都会学到新东西。再次感谢!哦,好的。因此它实际上保留了SQL Server中的数据类型,并在C#中对该数据类型调用ToString()方法,从而将其格式化为默认字符串。对吗?对,对。它试图尽可能接近MSSQL数据类型。有时没有1:1的等价物,但对于您的示例,应该有。谢谢我认为它知道这是一个日期时间,因为它将其格式化为日期时间,但我不知道它如何或是否从SQL Server中保留了数据类型。我猜你每天都会学到新东西。再次感谢!