我有一个问题,我试图按照我认为是数据库中的数字列来命令结果集。但是当我得到结果集时,它已经将列排序为好像是一个字符串(按字母顺序排列),而不是将其排序为int。
举个例子。我有这些数字,
1,2,3,4,5,10,11
当我在Transact SQL中订购时,我会回来:
1,10,11,2,3,4,5
我曾经遇到过与Datagridview相同的问题,而问题是由于排序正在完成,就像它是一个字符串一样。我假设这里发生了同样的事情。
我的完整SQL代码是:
SELECT TOP (12) DATEPART(YEAR, [OrderDate]) AS 'Year', DATEPART(MONTH, [OrderDate]) AS 'Month' , COUNT(OrderRef) AS 'OrderCount'
FROM [Order]
WHERE [Status] LIKE('PaymentReceived') OR [Status] LIKE ('Shipped')
GROUP BY DATEPART(MONTH, [OrderDate]), DATEPART(YEAR, [OrderDate])
ORDER BY DATEPART(YEAR, OrderDate) DESC, DATEPART(MONTH, OrderDate) desc
请注意 只有在我从Visual Studio调用该函数时才会发生错误的排序。在我的代码中是:
using (SqlConnection conn = GetConnection())
{
string query = @"SELECT TOP (12) DATEPART(YEAR, [OrderDate]) AS 'Year', DATEPART(MONTH, [OrderDate]) AS 'Month' , COUNT(OrderRef) AS 'OrderCount'
FROM [Order]
WHERE [Status] LIKE('PaymentReceived') OR [Status] LIKE ('Shipped')
GROUP BY DATEPART(MONTH, [OrderDate]), DATEPART(YEAR, [OrderDate])
ORDER BY DATEPART(YEAR, OrderDate) DESC, DATEPART(MONTH, OrderDate) desc";
SqlCommand command = new SqlCommand(query, conn);
command.CommandType = CommandType.Text;
using (SqlDataReader reader = command.ExecuteReader())
等。当我在SQL Server中运行语句时,没有问题。
我目前正在使用SQL Server 2005 Express Edition和Visual Studio 2005.
我尝试了很多遍布网络的东西。包括使用Convert()和ABS()无济于事。
非常感谢任何帮助。
编辑:在datareader返回后,有人提出了我正在做的事情......我使用名为“results”的SortedList变量。
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
string Date = reader["Year"].ToString() + "/" + reader["Month"].ToString();
string Orders = reader["OrderCount"].ToString();
results.Add(Date, Orders);
}
}
希望它有所帮助。
答案 0 :(得分:2)
你确定它们实际上是以非预期(整数)顺序从你的DataReader返回的吗?信任但验证(在调试器中)。
您还没有向我们展示您是如何将它从DataReader中取出来的,以及您将它放入的内容。
如果你将它们放在某种有序的集合中,其中int列被转换(可能是隐式的)到一个字符串(比如Dictionary<string, string>
),你会看到你在DataGrid中看到的同样的问题,无论你是他们从DataReader返回的顺序。在这种情况下,再次,它不是一个真正的SQL / SQLClient问题。
答案 1 :(得分:1)
您是否尝试过使用Cast(值为int)?
如:order by cast(datepart(year, OrderDate), int)
?
答案 2 :(得分:0)
您是否尝试过使用强制转换字符串? STR函数返回右对齐结果,因此在任何情况下顺序都应该是正确的:
ORDER BY STR(DATEPART(YEAR, OrderDate), 4, 0) DESC,
STR(DATEPART(MONTH, OrderDate), 2, 0) DESC