タイトル : 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 |