tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルADO-NETによる複数キーの存在チェック
記事No10840
投稿日: 2012/06/16(Sat) 10:40
投稿者かっちゃん
前回は助かりました。
ありがとうございます。
今度はADO-NETによる質問です

ADO-NETを使用した場合の複数キーでの存在チェクは
どのようなロジックにしたら適切なのでしょうか

VB6.0でADOを使用した時のチェックロジックは下記のように
一度データを読み込んだのでFINDで検索して存在チェックを
してきましたが、ADO-NETの場合はどのようになるでしょうか

**ADO(VB6.0)の場合**
   Private rsALibraryM As ADODB.Recordset
   wkstrSql = "select *  from LibraryM ORDER BY Kubun Asc, Category Asc, keyword Asc, LibraryNa Asc"
   rsALibraryM = New ADODB.Recordset
   rsALibraryM.Open(wkstrSql, CN, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
' ファイル存在チェック
Private Function SonzaiCheck(ByRef bytValue As Byte) As String
   If Not (rsALibraryM Is Nothing) Then
      If rsALibraryM.RecordCount = 0 Then
         MSGBOX("データが一件もありません")& KaOBJ.MsgItem
         Exit Function
      End If
    ' ファイルを読む
      With rsALibraryM
          .MoveFirst()
           If .Fields("Kubun").Value <> TEXT1 Then
              .Find("Kubun = " & TEXT1 & " ", ,ADODB.SearchDirectionEnum.adSearchForward)
           End If
           Do Until .EOF = True
              If .Fields("Kubun").Value = TEXT1 Then
                 If .Fields("Category").Value = TEXT2 Then
                    If .Fields("keyword").Value = TEXT3 Then
                       If Trim(.Fields("LibraryNa").Value) = TEXT4 Then
                          wkSonzai = 1  '存在
                          Exit Do
                         Else
                          If Trim(.Fields("LibraryNa").Value) > TEXT4 Then
                             wkSonzai = 0  '存在しない
               Exit Do
                          End If
                       End If
                      Else
                       If .Fields("keyword").Value > TEXT3 Then
                          wkSonzai = 0  '存在しない
                          Exit Do
                       End If
                    End If
                   Else
                    If .Fields("Category").Value > TEXT2 Then
                       wkSonzai = 0  '存在しない
                       Exit Do
                    End If
                 End If
                Else
                 If .Fields("Kubun").Value > TEXT1 Then
                    wkSonzai = 0  '存在しない
                    Exit Do
                 End If
              End If
             .MoveNext()
          Loop
      End With
     Else
      MSGBOX ("ライブラリマスターがアクティブになっておりません")
   End Select
End Function

**ADO-NETの場合**
' コネクションセット
   wkCNN.ConnectionString = glstrCnpath
   wkCMD.Connection = wkCNN
   wkCNN.Open()
  'データソースで実行するSQL文の設定
   wkstrSql = "select *  from LibraryM ORDER BY Kubun Asc, Category Asc, keyword Asc, LibraryNa Asc"
   Dim wkAdp1 As New OleDb.OleDbDataAdapter(wkstrSql, wkCNN)
  'データを取得する
   wkAdp1.Fill(wkDS, "LibraryM")
   dgdGrid.Columns.Clear()
  'データグリッドに表示するデータソースを設定
   dgdGrid.DataSource = wkDS
   dgdGrid.DataMember = "LibraryM"
' ファイル存在チェック
Private Function SonzaiCheck(ByRef bytValue As Byte) As String

End Function

よろしくお願いいたします  
  

[ツリー表示へ]
タイトルRe: ADO-NETによる複数キーの存在チェック
記事No10841
投稿日: 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

[ツリー表示へ]
タイトルRe^2: ADO-NETによる複数キーの存在チェック
記事No10842
投稿日: 2012/06/18(Mon) 14:31
投稿者かっちゃん
> > **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

 いつも助かります
 上記構文は助かりますが、わからないところがあり、お願いします

  画面にTEXT.BOX 、TEXT1, TEXT2, TEXT3, TEXT4 を作り
 上記構文により存在チェックを行い
 存在してないときは追加して DataGridView にも追加します。

 上記の <param name="tbl">LibraryM</param> の所は
  下記構文の DataGridView のセレクトした部分から 利用できるでしょうか
 また、追加するときは wkDS に追加すればよいのでしょうか
  初歩的な部分がわからなくてすみません 

   Dim wkDS As New DataSet
    Dim wkCNN As New OleDb.OleDbConnection
    Dim wkCMD As New OleDbCommawkDS:
  ' dgdGrid は DataGridView

      Try
            'データソースで実行するSQL文の設定
            wkstrSql = "select *  from LibraryM ORDER BY Kubun Asc, Category Asc, keyword Asc, LibraryNa Asc"
            Dim wkAdp1 As New OleDb.OleDbDataAdapter(wkstrSql, wkCNN)
            ' LibraryMからセレクトによるレコードデータを取得する
            wkAdp1.Fill(wkDS, "LibraryM")
            dgdGrid.Columns.Clear()
            ' データグリッドにLibraryMを連結
            ' dgdGrid.DataSource = wkDS
            ' データグリッドにLibraryMを表示
            ' dgdGrid.DataMember = "LibraryM"
        Catch ex As Exception
            ' 例外が発生した時の処理
            MessageBox.Show(ex.ToString, "例外発生")
        End Try


[ツリー表示へ]
タイトルRe^3: ADO-NETによる複数キーの存在チェック
記事No10847
投稿日: 2012/06/22(Fri) 13:47
投稿者かっちゃん
> > > **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
>
>  いつも助かります
>  上記構文は助かりますが、わからないところがあり、お願いします
>
>   画面にTEXT.BOX 、TEXT1, TEXT2, TEXT3, TEXT4 を作り
>  上記構文により存在チェックを行い
>  存在してないときは追加して DataGridView にも追加します。
>
>  上記の <param name="tbl">LibraryM</param> の所は
>   下記構文の DataGridView のセレクトした部分から 利用できるでしょうか
>  また、追加するときは wkDS に追加すればよいのでしょうか
>   初歩的な部分がわからなくてすみません 
>
>    Dim wkDS As New DataSet
>     Dim wkCNN As New OleDb.OleDbConnection
>     Dim wkCMD As New OleDbCommawkDS:
>   ' dgdGrid は DataGridView
>
>       Try
>             'データソースで実行するSQL文の設定
>             wkstrSql = "select *  from LibraryM ORDER BY Kubun Asc, Category Asc, keyword Asc, LibraryNa Asc"
>             Dim wkAdp1 As New OleDb.OleDbDataAdapter(wkstrSql, wkCNN)
>             ' LibraryMからセレクトによるレコードデータを取得する
>             wkAdp1.Fill(wkDS, "LibraryM")
>             dgdGrid.Columns.Clear()
>             ' データグリッドにLibraryMを連結
>             ' dgdGrid.DataSource = wkDS
>             ' データグリッドにLibraryMを表示
>             ' dgdGrid.DataMember = "LibraryM"
>         Catch ex As Exception
>             ' 例外が発生した時の処理
>             MessageBox.Show(ex.ToString, "例外発生")
>         End Try
>
  色々とロジックを組み合わせた結果、
 何とか、思うようにできました。
 また、よろしくお願いいたします 
 ありがとうございました  

[ツリー表示へ]