通过给出错误的命令来订购
本文关键字:命令 错误 出错 | 更新日期: 2023-09-27 18:30:49
我的 C# 程序中有一个 SQL 语句,如下所示:
SELECT * FROM XXX.dbo.XXX
WHERE Source = 'OH'
AND partnum = '1231202085'
ORDER BY partnum, Packaging, Quantity
在 SQL Server Management 中运行此查询时,结果将按预期排序。我的前 3 个结果具有相同的部件数和包装,数量为 32.0、50.8 和 51.0。
但是,当我从程序运行查询时,第一个返回数量为 50.8 的结果集。数量 的数据类型是十进制 (18,9)。我试过投射,它似乎不是数据类型问题。
我不知道为什么它会得到中间数量。
谢谢你们的快速回复,但是经过更多的测试,我在我的 C# 代码中发现了我的问题,而不是 sql。
得到查询结果后,我有:
if (PurchOrder.Read())
while (PurchOrder.Read())
忽略了第一次读取实际上会读取我的第一个结果,然后同时会得到我的第二个结果的事实。
我将 if 语句替换为:
if (PurchOrder.HasRows == true)
一切看起来都很好。
再次感谢您的回复。很抱歉提出误导性问题。
-科 迪
如果 partnum 是字母数字,它不会按数字顺序排序,除非你
-
左边的填充部分到完全相同的字符数
-
使用一些专门的字母数字排序进行排序。我通常使用:
order by RIGHT(REPLICATE('0', 1000) + LTRIM(RTRIM(CAST([field_name] AS VARCHAR(8000)))), 1000)
当然,如果您的字段较小,则可以使用低得多的填充数字。
从 SQL Server 端来看,只要部分、包装和数量是数字/浮点数字段,这应该绝对可以正常工作。 我担心的是,如果打包或部分是文本类型变量,其中10
在2
之前。
为避免这种情况,您必须在执行ORDER BY
之前CONVERT
或CAST
数据类型为整数/十进制类型。 查找 投射/转换 在波罗。
例如:
CREATE TABLE #test
(
mytest varchar(10)
)
INSERT INTO #test(mytest) VALUES('10')
INSERT INTO #test(mytest) VALUES('1')
INSERT INTO #test(mytest) VALUES('2')
INSERT INTO #test(mytest) VALUES('12')
INSERT INTO #test(mytest) VALUES('20')
SELECT * FROM #test ORDER BY mytest
DROP TABLE #test
产生不正确的排序。 并且可以这样处理:
SELECT * FROM #test ORDER BY CAST(mytest AS INT)
就客户端 (C#) 而言,您是否将其存储在某种网格视图中?
谢谢你们的快速回复,但是经过更多的测试,我发现我的问题在我的 C# 代码中,而不是 sql。
得到查询结果后,我有:
if (PurchOrder.Read())而 (PurchOrder.Read())
忽略了第一次读取实际上会读取我的第一个结果,然后同时会得到我的第二个结果的事实。
我将 if 语句替换为:
if (PurchOrder.HasRows == true)
一切看起来都很好。
再次感谢您的回复。很抱歉提出误导性问题。
-科 迪