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

タイトル Re^2: ADO-NETによる複数キーの存在チェック
投稿日: 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


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

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