ORDER BY にパラメータを指定するには?


TOTORO  2004-02-23 19:33:35  No: 112021  IP: [192.*.*.*]

すいません。SQLの話ですが。。。
ぜひお教えください。
VB6.0 +JET4.0です。
SQLのORDER BY句にパラメータを使用したいのですが、
もともとできない?のでしょうか?
だとしましたら代替としてどのような手法がございますでしょうか。

SELECT *
FROM  TBLKAIIN
WHERE (JOB_NO =
           (SELECT MASTER_JOB.JOB_NO
           FROM  MASTER_JOB
           WHERE MASTER_JOB.JOB名 = ?))
ORDER BY ?

編集    削除
特攻隊長まるるう  2004-02-23 19:53:23  No: 112022  IP: [192.*.*.*]

???…Field 名を指定すればいいんでないの?
パラメータってどんな?

編集    削除
TOTORO  2004-02-23 19:56:45  No: 112023  IP: [192.*.*.*]

ありがとうございます。
パラメータはFORMから受け渡すようにしています。
Set Prm = New ADODB Parameter

なんとか可変にしたいのです。。。
どうでしょうか。

編集    削除
特攻隊長まるるう  2004-02-23 20:32:38  No: 112024  IP: [192.*.*.*]

SQL 文は VB 側で編集している間はただの文字列ですので
文字列として"ORDER BY "の後に加えるので良いのではないでしょうか?

編集    削除
TOTORO  2004-02-23 20:38:52  No: 112025  IP: [192.*.*.*]

ありがとうございます。
私もそう思い、文字列で指定してみたのですが、
WHERE句の場合はうまく動きますが、
ORDER BY句のパラメータは反応しません。

下記URLにそれっぽい事が書いてありました。
ORDER BYへのパラメータ指定はVBではできないのでしょうか。。。

http://www.macromedia.com/jp/support/dreamweaver/building/aspnet_tags/aspnet_tags03.html

編集    削除
特攻隊長まるるう  2004-02-23 21:22:55  No: 112026  IP: [192.*.*.*]

ASP はやったことないので分かりません。
ただ、VB6.0 +JET4.0 だからというのは関係ないと思います。
ローカルの Access に関する質問が少し前にありましたが、
ADODB.Command で指定した SQL 文で ORDER BY 句は使えました。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200402/04020054.txt

そもそも
>Set Prm = New ADODB Parameter
の ADODB と Parameter の間に何でスペースが入ってるのか?…とか
SQL 文を実行するなら ADODB.Command じゃないのか?…とかTOTORO
さんがどういう環境で、どういう情報を何に設定しているのか想像できません。

編集    削除
TOTORO  2004-02-23 22:23:19  No: 112027  IP: [192.*.*.*]

ありがとうございます。
ソースは下記のようにしています。

Private Sub Command1_Click()

Dim mysqlr As String
Dim rsd As New ADODB.Recordset
Dim Prm As ADODB.Parameter
Dim Prm1 As ADODB.Parameter
Dim GT As String
Dim HT As String

GT = ctlJOB名.Text
HT = ctl選択項目(0).Text


'パラメータクエリを作成
mysqlr = "SELECT * From TBLKAIIN  WHERE TBLKAIIN.JOB_NO = (SELECT MASTER_JOB.JOB_NO From MASTER_JOB WHERE MASTER_JOB.JOB名 = ?) ORDER BY ?"

'Commandオブジェクトを作成
Set cmdMaster = New ADODB.Command
cmdMaster.ActiveConnection = cn
cmdMaster.CommandText = mysqlr

'Parameterオブジェクトを作成(JOB選択)
Set Prm = New ADODB.Parameter
Set Prm = cmdMaster.CreateParameter("Prm", adVariant, adParamInput, 30)
cmdMaster.Parameters.Append Prm
'Parameterオブジェクトを作成(第1SORT順)
Set Prm1 = New ADODB.Parameter
Set Prm1 = cmdMaster.CreateParameter("Prm1", adVariant, adParamInput, 30)
cmdMaster.Parameters.Append Prm1

'Parameterを設定
cmdMaster.Parameters("Prm").Value = GT
cmdMaster.Parameters("Prm1").Value = HT


'パラメータクエリを実行
Set rsd = New ADODB.Recordset
Set rsd = cmdMaster.Execute

With deMain
.cmdMaster ctlJOB名.Text, ctl選択項目(0).Text
End With

Unload Me

Set rsd = Nothing
Set Prm = Nothing
Set Prm1 = Nothing

Load Form1
Form1.Show
End Sub

※ORDER BY ?  を  ORDER BY "+ HT +"としましても  
  ソートしてくれません。
  う〜む。。。です

編集    削除
よねKEN  2004-02-23 22:43:46  No: 112028  IP: [192.*.*.*]

パラメータは普段使わないのであまり詳しくないですが、
ORDER BY句に指定するのは普通、列名ですからパラメータにはできないでしょう。
(1、2、・・・等の番号指定の場合はどうでしょう??)

で、
HT = ctl選択項目(0).Text

とありますが、この値は列名なんですか?

編集    削除
TOTORO  2004-02-23 23:08:21  No: 112029  IP: [192.*.*.*]

ありがとうございます。

>HT = ctl選択項目(0).Text
>とありますが、この値は列名なんですか?

そうです。TBLKAIINテーブルの列名を
別テーブルで値としてもたせています。
それをctl選択項目(0).Textに連結させています。

編集    削除
よねKEN  2004-02-24 01:07:53  No: 112030  IP: [192.*.*.*]

であれば、

>※ORDER BY ?  を  ORDER BY "+ HT +"としましても  
>  ソートしてくれません。
>  う〜む。。。です  

このやり方で問題ないはずですけどね。
変数mysqlrの中身は確認されましたか?

編集    削除
TOTORO  2004-02-24 01:54:07  No: 112031  IP: [192.*.*.*]

ありがとうございます。
ORDER BY "+ HT +"  とした場合、
SQLにうまく収まっているようです。
ORDER BY 自宅電話番号

このままSQLのみをDBで実行してみるとうまくソートされます。
が、上記VBの中だとソートされません。。。
どうしてなのでしょうか?

編集    削除
特攻隊長まるるう  2004-02-24 02:39:02  No: 112032  IP: [192.*.*.*]

なんかオイラの環境じゃレコードセット自体うまく取れないです(;▽;)
原因は…分かりませんが、とりあえず以下のソースを試してみてもらって
いいですか?
[VB6.0]
Private Sub Command1_Click()
    Dim cmdMaster As ADODB.Command
    Dim rsd As ADODB.Recordset
    Dim mysqlr As String
    
    mysqlr = "SELECT * FROM TBLKAIIN WHERE TBLKAIIN.JOB_NO = (SELECT MASTER_JOB.JOB_NO FROM MASTER_JOB " _
            & "WHERE MASTER_JOB.JOB名 = '" & ctlJOB名.Text _
            & "') ORDER BY " & ctl選択項目(0).Text

    Set cmdMaster = New ADODB.Command
    cmdMaster.ActiveConnection = cn
    cmdMaster.CommandText = mysqlr

    Set rsd = New ADODB.Recordset
    rsd.CursorLocation = adUseClient
    rsd.Open cmdMaster
    
    Debug.Print rsd.RecordCount
End Sub

編集    削除