tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: ADO-NETによる複数キーの存在チェック
投稿日: 2012/06/16(Sat) 16:07
投稿者魔界の仮面弁士
> **ADO(VB6.0)の場合**
> rsALibraryM = New ADODB.Recordset
> rsALibraryM.Open(wkstrSql, CN, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
どうみても VB6 の構文ではないですよね。
Set 句は無いですし、Call 無しでメソッド呼び出しに括弧が使われていますし。


> ' ファイル存在チェック
ファイル?


> Private Function SonzaiCheck(ByRef bytValue As Byte) As String
ここで、bytValue は何を意味しているのでしょうか? それもわざわざ ByRef で…。
それに、Select Case 句を使っていないのに End Select があったりと、
書き換える以前に前提条件がおかしいので、元のコードの意図を解釈しずらいです。

何より、戻り値が String 型であることの理由が読み取れませんでした。
戻り値自体を使っていないのですから、Sub で良いように思います。

Function で結果を返すなら、判定結果を Private wkSonzai As Integer 等で通知するかわりに、
戻り値を使って存在の有無を返すべきと思います。Recordset が無い場合や空の場合に、
wkSonzai の値を書き換えないという動作が必要だと、戻り値では不足するかも知れませんが。



> ADO-NETの場合はどのようになるでしょうか
ADO-NET ではなく ADO.NET です。

TEXT1〜TEXT4がどこから来た値で、それぞれの型が何かもわからないので、
元のコードの意図を読み切れているか分かりませんが、たとえば
データの有無をチェックするなら


''' <param name="tbl">LibraryM</param>
''' <returns>True:存在する、False:存在しない</returns>
Private Function Exists(tbl As DataTable) As Boolean
  If tbl Is Noting Then
    MsgBox("ライブラリマスターがアクティブになっておりません")
    Return False  '存在しない
  ElseIf tbl.Rows.Count = 0 Then
    MsgBox("データが一件もありません:" & KaOBJ.MsgItem)
    Return False  '存在しない
  Else
    Dim q = From r In tbl
            Where r!Kubun = TEXT1 AndAlso
                  r!Category = TEXT2 AndAlso
                  r!keyword = TEXT3 AndAlso
                  Trim(r!LibraryNa) = TEXT4
    Return q.Any()  '該当レコードがあれば True
  End If
End Function


などと書けるかと思います。
あるいは、該当データを取得することが目的ならこんな感じでしょうか。

''' <param name="tbl">LibraryM</param>
''' <returns>該当データ</returns>
Private Function Find(tbl As DataTable) As DataRow()
  If tbl Is Noting Then
    'Throw New ArgumentNullException("ライブラリマスターがアクティブになっておりません")
    MsgBox("ライブラリマスターがアクティブになっておりません")
    Retrun Nothing
  ElseIf tbl.Rows.Count = 0 Then
    'Throw New ArgumentOutOfRangeException("データが一件もありません" & KaOBJ.MsgItem)
    MsgBox("データが一件もありません。" & vbNewLine & KaOBJ.MsgItem, MsgBoxStyle.Exclamation)
    Return New DataRow() {}
  Else
    Dim q = From r In tbl
            Where r!Kubun = TEXT1 AndAlso
                  r!Category = TEXT2 AndAlso
                  r!keyword = TEXT3 AndAlso
                  Trim(r!LibraryNa) = TEXT4
    Return q.ToArray()
  End If
End Function


また、結果が複数件にならないとき(Kubun、Category、keyword が主キーの場合など)は、
配列で返す必要もないので、単独値として返すと良いでしょう。

Private Function Find(tbl As DataTable) As DataRow
    Dim q = From r In tbl
            Where r!Kubun = TEXT1 AndAlso
                  r!Category = TEXT2 AndAlso
                  r!keyword = TEXT3 AndAlso
                  Trim(r!LibraryNa) = TEXT4
    Return q.FirstOrDefault()
End Function

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。