3

私の 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 の結果セットが最初に返されます。Quantity のデータ型は decimal(18,9) です。キャストを試しましたが、データ型の問題ではないようです。

なぜ中間の量になるのかわかりません。


迅速な対応に感謝しますが、もう少しテストした後、SQLではなくC#コードに問題が見つかりました。

私が持っていたクエリ結果を取得した後:

if (PurchOrder.Read())
while (PurchOrder.Read())

最初の読み取りが実際に私の最初の結果を読み取り、次に 2 番目の結果を取得するという事実を見落としています。

if ステートメントを次のように置き換えます。

if (PurchOrder.HasRows == true)

そして、すべてがうまく見えます。

繰り返しになりますが、回答をありがとうございます。誤解を招く質問で申し訳ありません。

-コーディ

4

3 に答える 3

1

partnum が英数字の場合、次のいずれかを行わない限り、番号順にソートされません。

  • 正確に同じ文字数になるように、partnum を左にパッドします。

  • 特殊な英数字の並べ替えで並べ替えます。私は通常使用します:

    order by
    RIGHT(REPLICATE('0', 1000) + LTRIM(RTRIM(CAST([field_name] AS VARCHAR(8000)))), 1000)
    

もちろん、フィールドが小さい場合は、はるかに小さいパディング数を使用できます。

于 2012-04-12T17:17:49.937 に答える
0

partnum、packaging、および quantity が数値/float フィールドである限り、SQL Server 側から見ると、これは問題なく動作するはずです。私が心配しているのは、 Packaging または partnum が の10前に来るテキスト型の変数である場合2です。

これを回避するにはCONVERT、. CAST/Convert in BOLを参照してください。CASTORDER BY

たとえば、これ:

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#) から見れば、これをある種のグリッドビューに保存していますか?

于 2012-04-12T17:18:00.793 に答える
0

迅速な対応に感謝しますが、もう少しテストした後、SQLではなくC#コードに問題が見つかりました。

私が持っていたクエリ結果を取得した後:

if (PurchOrder.Read()) while (PurchOrder.Read())

最初の読み取りが実際に私の最初の結果を読み取り、次に 2 番目の結果を取得するという事実を見落としています。

if ステートメントを次のように置き換えます。

if (PurchOrder.HasRows == true)

そして、すべてがうまく見えます。

繰り返しになりますが、回答をありがとうございます。誤解を招く質問で申し訳ありません。

-コーディ

于 2012-08-17T17:14:01.937 に答える