locked
Silverlight 4 (WCF RIA Services) でSQLのUPDATEに相当する処理を行いたいのですが、やり方がわかりません。 RRS feed

  • 質問

  • Silverlight 4 (WCF RIA Services) で、データベースアプリを作っています。
    下記のSQLに相当する処理のやり方が分かりませんので、教えて下さい。

    UPDATE tbl_staff SET pass_flag = true WHERE staffID = 201019

    -----------------------------------------------
    tbl_staff は社員名簿のテーブル、列は、staffID (int), staff_name (char[32]), pass_flag (bool) の3つです。
    別のテーブルで、レコードの追加、削除はできたのですが、更新(任意のstaffIDを指定して、そのレコードのpass_flagを立てる)がどうしても出来ません。WCF RIA Services 以外のやり方でも結構です。
    宜しくお願いいたします。

    2011年5月30日 1:24

回答

  • > ヒントは、LINQ to SQL でした。

    たぶんLINQ to SQLでの書き方がヒントになった、ということだと思います。
    蛇足となるかもしれませんが念のため。
    Silverlight 4ではLINQ to SQLはサポートされてません。
    もしかするとSubmitChangesというメソッドからたどってヒントとなる情報にいきついたのかもしれませんが、RIA ServicesだとDataContextが何をサポートしているか、をベースに考える必要があります。

    http://msdn.microsoft.com/ja-jp/library/system.servicemodel.domainservices.client.domaincontext_members(v=VS.91).aspx

    http://msdn.microsoft.com/ja-jp/library/system.data.linq.datacontext.submitchanges.aspx

    うー、今気がついたけど、メソッド名「SubmitChanges」はLINQ to SQLで使われてたものですね。
    このあたり、歴史的経緯(RIA Servicesは開発当初LINQ to SQLをターゲットにしてた)がメソッド名に名残として残ってるもののような気がする。。。

     


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2011年5月30日 6:18

すべての返信

  • 書き方はいろいろあると思うので、どんなプログラム書いてみてできていないか示したほうがアドバイスもつきやすいと思います。
    基本的には該当するレコードを抽出して、pass_flagを書き換えてSubmitChangesを呼び出す、という動きになると思いますが、どこがわからないのでしょう。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2011年5月30日 1:57
  • 早速ありがとうございます。プログラム(一部)を載せさせていただきます。

    ファイル名: Problem.xaml

    <UserControl xmlns:basics="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"     x:Class="isms_testSilverlightApp.Problem"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Width="800" Height="700" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"
        xmlns:my="clr-namespace:isms_testSilverlightApp.Web"
        xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
        <Canvas x:Name="LayoutRoot" Background="White">
            <StackPanel Name="Problem_Panel" Orientation="Vertical" Canvas.Left="20" Canvas.Top="20">

        <Button Content="SetFlag" Height="20" Width="60" Click="SetFlagButton" />

            <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:tbl_staff, CreateList=true}" Height="0" LoadedData="tbl_staffDomainDataSource_LoadedData_1" Name="tbl_staffDomainDataSource" QueryName="GetTbl_staffQuery" Width="0">
                <riaControls:DomainDataSource.DomainContext>
                    <my:isms_testDomainContext />
                </riaControls:DomainDataSource.DomainContext>
            </riaControls:DomainDataSource>
            <sdk:DataGrid AutoGenerateColumns="False" Canvas.Left="19" Canvas.Top="166" Height="103" ItemsSource="{Binding ElementName=tbl_staffDomainDataSource, Path=Data}" Name="tbl_staffDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Width="601">
                <sdk:DataGrid.Columns>
                    <sdk:DataGridTextColumn x:Name="staffIDColumn" Binding="{Binding Path=staffID, Mode=OneWay}" Header="Staff ID" IsReadOnly="True" Width="SizeToHeader" />
                    <sdk:DataGridTextColumn x:Name="staff_nameColumn" Binding="{Binding Path=staff_name}" Header="Staff name" Width="SizeToHeader" />
                </sdk:DataGrid.Columns>
                    <sdk:DataGridCheckBoxColumn x:Name="pass_flagColumn" Binding="{Binding Path=pass_flag}" Header="Pass flag" Width="SizeToHeader" />
            </sdk:DataGrid>

          </StackPanel>
        </Canvas>
    </UserControl>


    ファイル名: Problem.xaml.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using isms_testSilverlightApp.Web;

    namespace isms_testSilverlightApp
    {
        public partial class Problem : UserControl
        {
            private Dictionary<int, DataGridRow> rowContainer = new Dictionary<int, DataGridRow>();

            static List<int> pid;
            static List<int> iid;
            static List<int> ans_staff;
            static List<int> ans;
            static int answers;
            static String[,] dt = new String [8,14];
            static bool flg = false;
            
            static List<string> str, str2;
            static List<List<string>> ret;

            public Problem()
            {
                InitializeComponent();

                this.tbl_itemDataGrid.LoadingRow += tbl_itemDataGrid_LoadingRow;
                pid = new List<int>();
                iid = new List<int>();
                ans_staff = new List<int>();
                ans = new List<int>();
            }

            (中略)

       // ボタンを押したときの処理

         private void SetFlagButton(object sender, RoutedEventArgs e)
            {
                var context = (isms_testDomainContext)tbl_staffDomainDataSource.DomainContext;
                tbl_staff ts = new tbl_staff();
                ts.staffID = 201019;
                context.SetPassFlag(ts);
            }

            (中略)

        }

    }

     

    ファイル名: isms_testDomainService.cs

    namespace isms_testSilverlightApp.Web
    {
        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.ComponentModel.DataAnnotations;
        using System.Data;
        using System.Linq;
        using System.ServiceModel.DomainServices.EntityFramework;
        using System.ServiceModel.DomainServices.Hosting;
        using System.ServiceModel.DomainServices.Server;

        (中略)

                [Invoke]
            public void SetPassFlag(tbl_staff tmp_staff)
            {
                var match = (from r in this.ObjectContext.tbl_staff
                            where r.staffID == tmp_staff.staffID
                            select r).FirstOrDefault();
                match.staffID = tmp_staff.staffID;
                match.pass_flag = true;
                ObjectContext.SaveChanges();
            }

        (中略)

    }

     

    ファイル名: tbl_staff.shared.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;

    namespace isms_testSilverlightApp.Web
    {
        partial class tbl_staff
        {
            public static tbl_staff Create(int staff_id, string name)
            {
                return new tbl_staff
                {
                    staffID = staff_id,
                    staff_name = name,
                    pass_flag = false
                };
            }

        }
    }

     

    直接関係ありそうなファイルのみを示しました。

    "isms_test"というのはプロジェクト名です。特に意味はありません。

    症状としては、"SetFlag"ボタンを押して、2秒ほどするとページエラーとしてステータスバーに表示され、画面が真っ白になってしまいます。

    どこが間違っているのか、ご教示くださいませ。



    2011年5月30日 2:45
  • 自力で解決できました。

    problem.xaml.cs で、下記のように書けば良かったようです。

            private void SetFlagButton(object sender, RoutedEventArgs e)
            {
                var context = (isms_testDomainContext)tbl_staffDomainDataSource.DomainContext;
                var query = from c in context.tbl_staffs where c.staffID == 201019 select c;
                foreach (tbl_staff ts in query)
                {
                    ts.pass_flag = true;
                }
                context.SubmitChanges();
            }

    ヒントは、LINQ to SQL でした。

    みなさん、どうもありがとうございました。m(__)m

     

    2011年5月30日 4:17
  • > ヒントは、LINQ to SQL でした。

    たぶんLINQ to SQLでの書き方がヒントになった、ということだと思います。
    蛇足となるかもしれませんが念のため。
    Silverlight 4ではLINQ to SQLはサポートされてません。
    もしかするとSubmitChangesというメソッドからたどってヒントとなる情報にいきついたのかもしれませんが、RIA ServicesだとDataContextが何をサポートしているか、をベースに考える必要があります。

    http://msdn.microsoft.com/ja-jp/library/system.servicemodel.domainservices.client.domaincontext_members(v=VS.91).aspx

    http://msdn.microsoft.com/ja-jp/library/system.data.linq.datacontext.submitchanges.aspx

    うー、今気がついたけど、メソッド名「SubmitChanges」はLINQ to SQLで使われてたものですね。
    このあたり、歴史的経緯(RIA Servicesは開発当初LINQ to SQLをターゲットにしてた)がメソッド名に名残として残ってるもののような気がする。。。

     


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2011年5月30日 6:18
  • 小野様:

    どうもご回答いただきありがとうございました。

    結果的にプログラムが動いたので結果オーライってところですが、完全に理解するには、歴史的経緯も調べておく必要がありますね。

    Silverlight を始めてまた1ヶ月しか経っていないので、まだまだ分からないところが沢山あります。

    また機会がありましたらよろしくお願いいたします。

    2011年5月31日 0:14