通过给出错误的命令来订购

本文关键字:命令 错误 出错 | 更新日期: 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 端来看,只要部分、包装和数量是数字/浮点数字段,这应该绝对可以正常工作。 我担心的是,如果打包或部分是文本类型变量,其中102之前。

为避免这种情况,您必须在执行ORDER BY之前CONVERTCAST数据类型为整数/十进制类型。 查找 投射/转换 在波罗。

例如:

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)

一切看起来都很好。

再次感谢您的回复。很抱歉提出误导性问题。

-科 迪