SQLをVBで扱う。(1)
テーマ:Windows
2010年01月08日 22時56分
SQLをVBで扱う。
VBでDBを操作していると、動的にSQLを生成する場面がたまに出てきます。
それを、効率よく行う方法を、(半分ネタで)考えてみました。
VBでSQLを扱う場合、普通は次のような感じでしょうか。
これではいけません。ただの文字列ではなく、意味を持たせましょう。
そのために次のようなクラスを作成しました。
足りないSQL句を実装して最初の例を記述すると次のようになりました。
(SQLクラスの全ソースは次回に記載します。)
行を分けずに書けばこんな感じです(うげ~)
次回に続きます。
VBでDBを操作していると、動的にSQLを生成する場面がたまに出てきます。
それを、効率よく行う方法を、(半分ネタで)考えてみました。
VBでSQLを扱う場合、普通は次のような感じでしょうか。
Dim s As String = ""
s &= "Select 見積ID,顧客名,sum(見積詳細.金額) "
s &= " From 見積 Join 顧客 on 見積.顧客ID=顧客.顧客ID Join 見積詳細 on 見積.見積ID=見積詳細.見積ID "
s &= " Where 見積ID>=100 and 見積詳細.金額>=0"
s &= " Group By 見積ID,顧客名 "
s &= " Having sum(見積詳細.金額)>=100"
Debug.Print(s)
ここでのSQLは、VB的にはただの文字列です。s &= "Select 見積ID,顧客名,sum(見積詳細.金額) "
s &= " From 見積 Join 顧客 on 見積.顧客ID=顧客.顧客ID Join 見積詳細 on 見積.見積ID=見積詳細.見積ID "
s &= " Where 見積ID>=100 and 見積詳細.金額>=0"
s &= " Group By 見積ID,顧客名 "
s &= " Having sum(見積詳細.金額)>=100"
Debug.Print(s)
これではいけません。ただの文字列ではなく、意味を持たせましょう。
そのために次のようなクラスを作成しました。
Class SQL
Dim s As String = ""
Public Sub New()
End Sub
Public Sub New(ByVal s As String)
Me.s = s
End Sub
Public Function [Select](ByVal ParamArray arg() As String) As SQL
Me.s &= " Select " & String.Join(",", arg)
Return Me
End Function
Public Function From(ByVal arg As String) As SQL
Me.s &= " From " & arg
Return Me
End Function
Public Shared Widening Operator CType(ByVal a As SQL) As String
Return a.s
End Operator
End Class
Select句とFrom句をSQLオブジェクトの関数にしたので、Dim s As String = ""
Public Sub New()
End Sub
Public Sub New(ByVal s As String)
Me.s = s
End Sub
Public Function [Select](ByVal ParamArray arg() As String) As SQL
Me.s &= " Select " & String.Join(",", arg)
Return Me
End Function
Public Function From(ByVal arg As String) As SQL
Me.s &= " From " & arg
Return Me
End Function
Public Shared Widening Operator CType(ByVal a As SQL) As String
Return a.s
End Operator
End Class
Dim s As String = ""
s &= "Select * "
s &= " From 見積"
Debug.Print(s)
はs &= "Select * "
s &= " From 見積"
Debug.Print(s)
Dim q as New SQL
q.Select("*")
q.From("見積")
Debug.Print(q)
と書けます。どうです?これだけ見るとよさそうでしょ。q.Select("*")
q.From("見積")
Debug.Print(q)
足りないSQL句を実装して最初の例を記述すると次のようになりました。
(SQLクラスの全ソースは次回に記載します。)
Dim q as New SQL
q.Select("見積ID", "顧客名", "sum(見積詳細.金額)")
q.From("見積")
q.Join("顧客", "見積.顧客ID=顧客.顧客ID")
q.Join("見積詳細", "見積.見積ID=見積詳細.見積ID")
q.Where("見積ID>=100 and 見積詳細.金額>=0")
q.GroupBy("見積ID", "顧客名")
q.Having("sum(見積詳細.金額)>=100")
Debug.Print(q)
q.Select("見積ID", "顧客名", "sum(見積詳細.金額)")
q.From("見積")
q.Join("顧客", "見積.顧客ID=顧客.顧客ID")
q.Join("見積詳細", "見積.見積ID=見積詳細.見積ID")
q.Where("見積ID>=100 and 見積詳細.金額>=0")
q.GroupBy("見積ID", "顧客名")
q.Having("sum(見積詳細.金額)>=100")
Debug.Print(q)
行を分けずに書けばこんな感じです(うげ~)
Dim q as New SQL
q.Select("見積ID", "顧客名", "sum(見積詳細.金額)").From("見積").Join("顧客", "見積.顧客ID=顧客.顧客ID").Join("見積詳細", "見積.見積ID=見積詳細.見積ID").Where("見積ID>=100 and 見積詳細.金額>=0").GroupBy("見積ID", "顧客名").Having("sum(見積詳細.金額)>=100")
Debug.Print(q)
q.Select("見積ID", "顧客名", "sum(見積詳細.金額)").From("見積").Join("顧客", "見積.顧客ID=顧客.顧客ID").Join("見積詳細", "見積.見積ID=見積詳細.見積ID").Where("見積ID>=100 and 見積詳細.金額>=0").GroupBy("見積ID", "顧客名").Having("sum(見積詳細.金額)>=100")
Debug.Print(q)
次回に続きます。
イイ!と思ったら拍手をお願いします↓
コメント
トラックバック
この記事のトラックバック URL :
http://blog.murablo.jp/skyline/trackback/141749
http://blog.murablo.jp/skyline/trackback/141749




