DOBON.NETプログラミング道掲示板
(現在 過去ログ3 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33897 / inTopicNo.1)  DataTableにSQLを実行できますか?
  
□投稿者/ だんご 一般人(3回)-(2018/07/03(Tue) 20:15:26)
  • アイコン環境/言語:[VB.NET] 
    分類:[.NET] 

    重ねて質問させて頂きます。

    (VisualBasic)
    FormにボタンとDataGridViewを2つ貼り付けて次のコードを実行します。
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    Dim dt As New DataTable
    With dt
    .Columns.Add("id", GetType(Integer))
    .Columns.Add("name", GetType(String))
    .Columns.Add("No1", GetType(String))
    .Columns.Add("No2", GetType(String))
    .Rows.Add(1, "岡田", "1", "1")
    .Rows.Add(2, "山田", "2", "1")
    .Rows.Add(3, "川上", "3", "1")
    .Rows.Add(4, "下温湯", "4", "1")
    .Rows.Add(5, "品川区", "2", "2")
    .Rows.Add(6, "新宿区", "4", "2")
    End With
    DataGridView1.DataSource = dt

    Dim dt2 As New DataTable
    With dt2
    .Columns.Add("id", GetType(Integer))
    .Columns.Add("name", GetType(String))
    .Columns.Add("Address", GetType(String))
    .Rows.Add(1, "岡田", "")
    .Rows.Add(2, "山田", "品川区")
    .Rows.Add(3, "川上", "")
    .Rows.Add(4, "下温湯", "新宿区")
    End With
    DataGridView2.DataSource = dt2
    End Sub

    dtの内容を、dt2の内容に変換する方法を教えてください。コードで変換するしか無いですか?

    詳しい方、ご指導のほど宜しくお願い致します。
引用返信 削除キー/
■33899 / inTopicNo.2)  Re[1]: DataTableにSQLを実行できますか?
□投稿者/ 魔界の仮面弁士 大御所(1122回)-(2018/07/03(Tue) 22:24:26)
  • アイコンNo33897に返信(だんごさんの記事)
    > dtの内容を、dt2の内容に変換する方法を教えてください。
    すみません、質問の意味が分からなかったです。

    dt の各列をどのような規則で変換して
    dt2 の形にするのか、説明してもらえないでしょうか。

    > DataTableにSQLを実行できますか?
    DataTable ではなく SQL の方が説明しやすいのであれば、
    SQL 相当の書き方で説明していただいても構いません。
引用返信 削除キー/
■33900 / inTopicNo.3)  Re[2]: DataTableにSQLを実行できますか?
□投稿者/ だんご 一般人(4回)-(2018/07/04(Wed) 08:48:15)
  • アイコン返信有難うございます。
    魔界の仮面弁士さんの書き込みを読んで、どのように説明しようかと考えていたら、根本的な勘違いに気づきました。
    一旦、質問を取り下げさせて頂きます。

    再度考えて、わからなかったら質問させて頂きますので今後も懲りずに宜しくお願い致します。
    お手数をお掛けしました
解決み!
引用返信 削除キー/
■33901 / inTopicNo.4)  Re[3]: DataTableにSQLを実行できますか?
□投稿者/ 魔界の仮面弁士 大御所(1123回)-(2018/07/04(Wed) 09:31:07)
  • アイコン
    No33900に返信(だんごさんの記事)
    > 一旦、質問を取り下げさせて頂きます。
    
    書き込みのルールより引用:
    https://dobon.net/vb/bbs/index.html
    》 解決していない質問のスレッドを「解決済み」にしないでください。
    》 質問者が解決するのをあきらめた(放棄した)というのは、
    》 「解決済み」にはなりません。
    
    
    質問の取り下げに対しても適用されるルールなのかは分からないので、
    一応、解決済みチェックは付けたままにしておきます。
    
    
    で、とりあえず… SQL で言う所の
    
    SELECT
      T1.No1 As id
    , T1.name As name
    , T2.name As Address
    FROM
      (SELECT name, No1 FROM dt WHERE No2 = '1') AS T1
      LEFT JOIN
      (SELECT name, No1 FROM dt WHERE No2 = '2') AS T2
      ON T1.No1 = T2.No1
    ORDER BY
      T1.No1
    
    のような結果が欲しいという意味なら、こういう処理方法があります。
    
    
    Dim t1 = From r In dt.AsEnumerable()
             Where r.Field(Of String)("No2") = "1"
    
    Dim t2 = From r In dt.AsEnumerable()
             Where r.Field(Of String)("No2") = "2"
    
    Dim q = From r1 In t1
            Group Join r2 In t2
            On r1!No1 Equals r2!No1 Into g = Group
            Select id = r1.Field(Of Integer)("id"),
                name = r1.Field(Of String)("name"),
                Address = If(g.Any(), CStr(g.First()!name), String.Empty)
            Order By id
    
    DataGridView3.DataSource = q.ToArray()

解決み!
引用返信 削除キー/
■33902 / inTopicNo.5)  Re[4]: DataTableにSQLを実行できますか?
□投稿者/ だんご 一般人(5回)-(2018/07/04(Wed) 13:39:44)
  • アイコンはい!まさしく、魔界の仮面弁士さんのご指導通りの結果が欲しかったのです。

    即ち、DataTableに対するSQL可否以前に、元のTableから読み込む見直せばこと済む話なので、質問を取りさせさせて頂きました。
    また、いつまでも、質問状態にしておくのも失礼と考え解決済みとさせて頂きました。

    ところが、DataTalelに対しても回答があったのですね?素晴らしい!
    Dim q = From r1 In t1
    Group Join r2 In t2
    On r1!No1 Equals r2!No1 Into g = Group
    Select id = r1.Field(Of Integer)("id"),
    name = r1.Field(Of String)("name"),
    Address = If(g.Any(), CStr(g.First()!name), String.Empty)
    Order By id
    の部分は、LINQでしょうか?
    私の知識がこの部分まで至っていないので内容が理解できませんが、LINQに価値があることが実感できたので、今後、勉強させて頂きます。

    本当に有難うございました。また、大変失礼致しました。
    これに懲りずに今後とも宜しくお願い致します。
引用返信 削除キー/
■33904 / inTopicNo.6)  Re[5]: DataTableにSQLを実行できますか?
□投稿者/ 魔界の仮面弁士 大御所(1125回)-(2018/07/04(Wed) 16:33:20)
  • アイコン
    No33902に返信(だんごさんの記事)
    > LINQでしょうか?
    はい。
    
    LINQ に不慣れなら、DataSet のリレーションシップを使う手もあります。
    
    下記では、3 つの DataGridView の内容が連動するように設定しましたが
    実際に使うのは DataGridView3 だけでも構いません。
    
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim dt As New DataTable()
        dt.Columns.Add("id", GetType(Integer))
        dt.Columns.Add("name", GetType(String))
        dt.Columns.Add("No1", GetType(String))
        dt.Columns.Add("No2", GetType(String))
        dt.Rows.Add(1, "岡田", "1", "1")
        dt.Rows.Add(2, "山田", "2", "1")
        dt.Rows.Add(3, "川上", "3", "1")
        dt.Rows.Add(4, "下温湯", "4", "1")
        dt.Rows.Add(5, "品川区", "2", "2")
        dt.Rows.Add(6, "新宿区", "4", "2")
        dt.AcceptChanges()
    
    
        Dim ds As New DataSet("ds")
        Dim dt1 As DataTable = dt.Select("[No2]='1'").CopyToDataTable()
        Dim dt2 As DataTable = dt.Select("[No2]='2'").CopyToDataTable()
        dt1.TableName = "dt1"
        dt2.TableName = "dt2"
        dt1.PrimaryKey = New DataColumn() {dt1.Columns("No1")}
        dt2.PrimaryKey = New DataColumn() {dt2.Columns("No1")}
        ds.Tables.Add(dt1)
        ds.Tables.Add(dt2)
        ds.Relations.Add(dt1.Columns("No1"), dt2.Columns("No1"))
    
        '式列[Address]を追加
        dt1.Columns.Add("Address", GetType(String), "Min(Child.Name)")
    
        DataGridView1.DataSource = dt1
        DataGridView1.Columns(4).Visible = False  '式列[Address]を隠す
    
        DataGridView2.DataSource = dt2
    
        DataGridView3.DataSource = dt1
        DataGridView3.Columns(2).Visible = False  '列[No1]を隠す
        DataGridView3.Columns(3).Visible = False  '列[No2]を隠す
    End Sub

引用返信 削除キー/
■33905 / inTopicNo.7)  Re[6]: DataTableにSQLを実行できますか?
□投稿者/ だんご 一般人(6回)-(2018/07/04(Wed) 17:36:13)
  • アイコン重ね重ねご指導有難うございます。

    実は、最近。DataSetっていらなくね〜?
    って感じていました。単なる箱で、どうしても入れなきゃならないって理由があるのかな?って。
    例えば、GroupBoxのような、RadioButtonの選択を分けるような便利な機能・・・

    ネットで、ADOとDataSetとDataGridViewの相性が良いから活用すべきとの書き込みを読んだことがありましたが、ピンと来ていませんでした。
    こういうことだったんですね?

    便利な機能を使いこなせるようになるまでまだまだかかりそうですが、お付き合いのほど、宜しくお願い致します。(何も差し上げられませんが・・笑)

    今度こそ、解決済みとさせて頂きます。


解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -