- - PR -
データグリッドの値をデータソースへ
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2002-12-12 10:29
下記関数の呼び出し先で
Dim sql As String 'SQL Dim dsOra As DataSet 'データセットオブジェクト Dim getTbl As String = "getTbl" 'データセットオブジェクトにセットするTBL名 を定義し,下記の関数を呼び出し,データグリッドコントロールに取得したデータセットを代入して いますが,データグリッドに追加,変更,削除した場合,データソースに結果を反映させる データアダプタの使い方がわかりません。 (SQLは複数のテーブルからある条件を指定してSelectしているものです。) どなたか詳しい人がいたら教えてください。よろしくお願いします。 Public Function gDbGet(ByVal Sql As String, ByRef dsOra As DataSet, ByRef getTbl As String) As Boolean '■■■■■■■■■■■■■■■■■■■■■■■■■■ '@(f) '機能 :データベースレコード取得処理 '引き数 :ARG1 -SQL ' :ARG2 -データセットオブジェクト(参照渡し) ' :ARG2 -データセットTBL名称 '返り値 :true/false '機能説明 :引数として受け取ったSQLに対するデータセットをDBより取得する '備考 :なし '■■■■■■■■■■■■■■■■■■■■■■■■■■ Dim adtrsora As OleDb.OleDbTransaction 'トランザクションオブジェクト Dim adadpOra As OleDb.OleDbDataAdapter 'データアダプタ Dim strErrText As String 'エラーmsg '戻り値初期設定 gDbGet = False Try adadpOra = New OleDb.OleDbDataAdapter() dsOra = New DataSet() System.Diagnostics.Debug.WriteLine(Sql) 'デバックプリント adadpOra.SelectCommand = New OleDb.OleDbCommand() adadpOra.SelectCommand.CommandType = CommandType.Text adadpOra.SelectCommand.CommandText = Sql adadpOra.SelectCommand.Connection = GmadcnnOra adadpOra.Fill(dsOra, getTbl) gDbGet = True Catch System.Diagnostics.Debug.WriteLine(ErrorToString()) 'デバックプリント 'リソースの開放 dsOra.Dispose() gDbGet = False End Try end function | ||||
|
投稿日時: 2002-12-12 13:49
>データグリッドに追加,変更,削除した場合,データソースに結果を反映させる
>データアダプタの使い方がわかりません。 >(SQLは複数のテーブルからある条件を指定してSelectしているものです。) 複数のテーブルに更新をかけるのならば OleDbTransactionを使用してはいかがでしょうか? ヘルプで検索してみて下さい。 『SqlConnection.BeginTransaction メソッド』 これはSQLServerの使用方法ですが参考になると思います。 | ||||
|
投稿日時: 2002-12-12 13:57
こんにちは。
Webでは、慣例的に「半角カタカナは禁止」ですので、ご注意ください。
それは無理です。外部からSELECT文を供給するなら、UPDATE文、INSERT文、DELETE文も外部から供給してやる必要があります。もっとも、その場合はバインドの指定も外部から供給しなければなりませんが。また、ご提示のソースではデータセットを返すので、UPDATE文などの構成をする必要はありません(構成しても、それを返していないので無駄になります)。 もう少しオブジェクト指向っぽくするなら、SELECT文で返す列のセットごとにクラスを作成し、そのテーブルの静的プロパティーとして4つのSQL文(を構成したOleDBDataAdapter)を提供するという方法もあります。 >> dsOra.Dispose() 呼べてしまいますが、実はDisposeメソッドはProtected属性なので、呼ぶ必要はありません。Clearメソッドを呼べばよいと思います。 | ||||
|
投稿日時: 2002-12-13 00:37
返答ありがとうございます。ついでに・・,DataAdapterオブジェクトの4つのコマンドオブジェクトのCommandTextプロパティに設定するSQLをウイザードが作成してくれるような形式でコードで作成して,設定したいのですが、どのようにSQLを作成すればいいのでしょうか?Dataセットにデータは相変わらず2つ以上のテーブルから持ってきた場合を想定しています。分る方がいたらお願いします。教えて下さい。
| ||||
|
投稿日時: 2002-12-13 11:35
おっしゃっている意味/しようとされていることがよくわかりません。具体例を示していただけないでしょうか。例えば、最初のポストにはソースがありましたので、「関数にSELECT文を渡してDataAdapterを作成し、そのDataAdapterを構成するために他のSQL文を作る」ことがわかりました。 『ウイザードが作成してくれる』のウイザードは、何を指しているのでしょうか。プログラムの実行時にSQL文を作成するようなウイザードを意味していますか?そういうものは聞いたことがありません。 静的にSQL文を作成してくれるウイザードであれば、デザイン画面にDataAdapterを置いたときに自動的に走ります。デザイナ上で設定すれば、オプションで無効にしなければ、INSERT文その他のSQL文ができあがっています(そのまま使えるような代物ではありませんが)。 それとも、こうしてできたSQL文を作成する方法についてのご質問でしょうか?それならばSQLの文法に従ってINSERT文その他を組み立てます。 もしかして、先のご質問と同じで、SELECT文からINSERT文、UPDATE文、DELETE文を作るのでしょうか?それならば、渡されたSELECT文と、テーブルの構造を解析する必要があります。SELECTしてくるテーブルのプライマリキーはどの列か、SELECTする列はどのテーブルに属するのか、「KEY−詳細」関係にあるテーブルがあるのか、等々・・・『外部からSELECT文を供給するなら、UPDATE文、INSERT文、DELETE文も外部から供給してやる必要があります。』というのは、こんな解析をするだけの力量がありますか、ということです。単純にやるなら、「テーブルには必ず別名を付ける」というルールを設け、データを一意にするためにはすべてのデータが一致するという条件にすれば可能でしょう(DataAdapterが自動生成するのはこういうSQL文)。ただし、1つのOleDbCommandの中で複数の表を更新することができるかどうかは?です。 | ||||
1
