タイトル : Re^3: ADO-NETによる複数キーの存在チェック 投稿日 : 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 > 色々とロジックを組み合わせた結果、 何とか、思うようにできました。 また、よろしくお願いいたします ありがとうございました |