2009年12月7日月曜日

Sync FrameworkによるDBの同期

前回がファイル・フォルダの同期だったので今回はデータベースの同期にチャレンジ。ただ、やろうと思うと結構難しいところがでてくる(異種DBとか)ので、今回はダンプファイルからリストアよろしく、親DBの内容を子DBに単純コピーする程度でやってみた。

ちと長めになるけどこんなソース。

Private Sub DbSync()

    Const SCOPE_NAME As String = "SCOPE1"
    Const SCHEMA_NAME As String = "" '"Sync"
    Const PREFIX_NAME As String = "Sync"

    Dim sourceProvider As New SqlSyncProvider
    Dim destinationProvider As New SqlSyncProvider

    Dim srcStr As New SqlConnectionStringBuilder
    Dim desStr As New SqlConnectionStringBuilder
    With srcStr
        .DataSource = "TESTSERVER"
        .InitialCatalog = "TESTDB"
        .PersistSecurityInfo = True
        .IntegratedSecurity = True
    End With
    With
desStr
        .DataSource = "TESTSERVER"
        .InitialCatalog = "TESTDB2"
        .PersistSecurityInfo = True
        .IntegratedSecurity = True
    End With

    Using srcConn As New SqlConnection(srcStr.ToString)
        Using desConn As New SqlConnection(desStr.ToString)
           '変更追跡用テーブルを生成
            Dim serverScope As New DbSyncScopeDescription(SCOPE_NAME)
            '対象テーブル一覧の取得
            Dim query As String = "SELECT NAME, OBJECT_ID FROM SYS.TABLES"
            Using sqlAdapter As New SqlDataAdapter(query, srcConn)
                Using tblSet As New DataTable
                    sqlAdapter.Fill(tblSet)
                    For Each child As DataRow In tblSet.Rows
                        If child.Item(0).ToString.Contains(PREFIX_NAME) Then Continue For

                        Dim targetTable As DbSyncTableDescription = _
                          SqlSyncDescriptionBuilder.GetDescriptionForTable(child.Item(0).ToString, srcConn)
                        serverScope.Tables.Add(targetTable)
                    Next
                End Using
            End Using

            ‘同期の設定

            Dim serverConfig As New SqlSyncScopeProvisioning(serverScope)
            With serverConfig
                .ObjectSchema = SCHEMA_NAME
                .ObjectPrefix = PREFIX_NAME

                If Not .ScopeExists(SCOPE_NAME, srcConn) Then
                    .SetCreateTableDefault(DbSyncCreationOption.Skip)
                    .Apply(srcConn)
                End If

            End With

            Dim clientScope As DbSyncScopeDescription = _
                SqlSyncDescriptionBuilder.GetDescriptionForScope(SCOPE_NAME, PREFIX_NAME, SCHEMA_NAME, srcConn)
            Dim clientConfig As New SqlSyncScopeProvisioning(clientScope)
            With clientConfig
                .ObjectSchema = SCHEMA_NAME
                .ObjectPrefix = PREFIX_NAME

                If Not .ScopeExists(SCOPE_NAME, desConn) Then
                    .Apply(desConn)
                End If
            End With

            With sourceProvider
                .ScopeName = SCOPE_NAME
                .ObjectPrefix = PREFIX_NAME
                .ObjectSchema = SCHEMA_NAME
                .Connection = srcConn
            End With
            With
destinationProvider
                .ScopeName = SCOPE_NAME
                .Connection = desConn
                .ObjectPrefix = PREFIX_NAME
                .ObjectSchema = SCHEMA_NAME
            End With 
           
‘同期処理の実行
            Dim syncAgent As New SyncOrchestrator
            With syncAgent
                .RemoteProvider = sourceProvider
                .LocalProvider = destinationProvider
                .Direction = SyncDirectionOrder.Download
                .Synchronize()
            End With

        End Using

    End Using

 

    MessageBox.Show("DBの同期が終了しました。", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information)

End Sub

とりあえずこのくらいのロジックで、DB間にてレコードの同期を取ることができた。

気を付けるのは、レコード間の同期を取るために専用のテーブルやトリガ、ストアドプロシージャが必要になるんだけど、それはSqlSyncScopeProvisioning.Applyメソッド呼び出し時に作成してくれる。この時このサンプルのようにスキーマを設定していないと、同一スキーマに作成される=同一権限の人にはテーブルやらがたくさん増えて見える、ことになるのが注意。スキーマを予め用意しておけば、切り離して見ることができるのでそれがベター、というかベストだろうねぇ。

残念ながらスキーマまでは作成してくれませんw

2009年12月3日木曜日

Sync Frameworkによるファイルの同期

いろいろあってSync Frameworkによる同期について調査。
とりあえず、でやってみたのは「ファイルの同期」。SyncToyとか使ってやればいいんだけど勉強と調査をかねてやってみた。

結論から言うと「物凄く簡単にファイル同期ができる」というところに。

注意すべきところは
「参照設定で個別にSyncFrameworkのDllを設定する必要がある」
点かな。今回のファイル同期であれば、

  • Microsoft.Synchronization(Microsoft.Synchronization.dll)
  • Microsoft.Synchronization.Files(Microsoft.Synchronization.Files.dll)

これらはSyncFramework2.0をインストールすると、ProgramFiles関係のフォルダにインストールされているのでそこから直接参照しないといけないのよ。GACに入っていると思っていたから少し探してしまった。

'同期オプションの指定

Dim syncOption As FileSyncOptions = FileSyncOptions.CompareFileStreams Or FileSyncOptions.ExplicitDetectChanges Or FileSyncOptions.RecycleConflictLoserFiles Or FileSyncOptions.RecycleDeletedFiles

 

'対象ファイルの設定(今回未使用)
Dim syncFilter As New FileSyncScopeFilter
With syncFilter

End With

 

'同期処理の実行
Using src As New FileSyncProvider(コピー元, Nothing, syncOption)
    Using dest As New FileSyncProvider(コピー先, Nothing, syncOption)

        src.DetectChanges()
        dest.DetectChanges()

        Dim syncAgent As New SyncOrchestrator
        With syncAgent
            .RemoteProvider = src
            .LocalProvider = dest
            .Direction = SyncDirectionOrder.Download
            .Synchronize()
        End With

    End Using
End Using

 

以上がファイル同期に書いてみたソースの全部。これだけで楽々できてしまうので、業務システムとかでよくある最新モジュールの適用などは大分楽にできるようになるねぇ。もちろんセキュリティ関係とか処理タイミングとか考えないといけないことが多々あるので、そこらへんは一工夫。

2009年11月30日月曜日

Windows 2008 Server R2でVB6アプリ

64ビット版のみとなった2008R2で、VB6アプリがどうなるかを自分の案件に限って動作確認してみた。あくまでもメモ。何かあっても責任は一切ないw

  • VB6製アプリ

基本そのまま動く。もちろんパスのハードコーディングとか「今更か!」というヤカラはなしにして。予想していたよりもWow64はすごい。

  • サードパーティコントロール

自分の案件では某社のDenpyoManとActiveReport。まぁこれも特に問題なく動作してしまったw

未だに動作する環境でリリースするMicrosoftはとてもすごいよねぇ。もし自分がオーナーとかPMだったら、とっくに動作対象外にしてばっさりと切り捨てているだろうし。

インストールの際に利用しているコントロールによっては管理者権限が必須。Tabとかフレックスグリッドとか。それ以外なら恐らく標準ユーザーでもいけるんじゃなかろうか。

2009年11月27日金曜日

TechFieldesセミナー札幌 に参加してきました

今日はマイクロソフトのTechFieldersセミナーに参加してきました。
今回のテーマは「仮想化」。Hyper-Vな話題。

自分は実際に業務としてHyper-Vやリモートデスクトップサービスを利用してはいないんだよね。
せいぜいリモートデスクトップをメンテナンス用に使っているぐらいで。
後は記事とかそこらへんにある知識だけだったので、今回のセミナーは実物を見ながらというのがとても面白かったなぁ。

エバンジェリストの高添さんのメインセッションはかなりわかりやすかった。
そしてLTではトータル4名の方々が行ってくれたが、どれもまぁ目を引くというか何というかw
よく5分という枠に興味を引く内容をつめこめるもんだと感心ですわ。

個人的には一番最後のMSエバンジェリストな松崎さんのLTが時間内に終わらないというオチもつけてくれてウケました。

とにかく今回のセミナーは久々に欲を刺激されたいいセミナーだったなぁ。
なんとかしてAPP-Vも検証したくなったし、Hyper-V環境もひっそりと(!)構築しようかとw

2009年11月10日火曜日

WindowsFormsとWPF

最近は仕事の合間にWPFを研究するようにメンバーに指示を出しているので、自分も負けじと勉強中。わかってはいたんだけど、改めてWPFのスゴサに感動気味。

伝票形式のグリッド?何それ、WPFならラクショーじゃんw

いやぁ・・・軽く触っただけで多段レイアウトの一覧表示がさくっと作れるというのは業務系システムにこそ、メリット大きいよなぁ。正直WindowsFormsを利用し続ける事に意義が見出せなくなるぐらい・・・。

まだWPFやっていない人にとっては時間もかかって大変だろうけど、かけた時間以上の効果が間違いなくWPFにはあるねぇ。今からでも遅くないからやるべきだわ。

一番問題なのはウチの社内みたいに、データバインディングも使っていない、場合なんだよねぇw

さてさてどうしましょ。

2009年10月30日金曜日

SqlCEConnectionBuilder?

実際には含まれていないw
ということで自作してみる。

ConnectionBuilderはSystem.Data.Common.DbConnectionStringBuilderを継承して作ればいいので、基本的な部分はほとんど実装することないんだよね。他のConnectionBuilderの実装を見たわけではないんだけど、恐らくはここらへんをクリアしてれば十分かと。

  • 初期値の保持
  • 接続文字列には初期値以外の設定を出力する

初期値についてはMSDNとかTechNetを見てもらえば記載されているのでそれを転記。あとは接続文字列出力部分、なんだけどそのメソッド自体は特にどうこうしなくてもいいのよね。

設定の保持方法を他と合わせてあげればOK。実際にはDbConnectionStringBuilderにて用意されているHashTableに値を追加したり削除したりするよう、プロパティの実装をやってあげればOK。

2009年10月21日水曜日

札幌イノベーションデイ2009

行ってきました!

今回の目的は大きく分けて二つ。
一つはエバンジェリストのセッション。もう一つは・・・アレを見てくることw

ところがアレについてはBlogでの公開にNGがかけられたので書けませんw

エバンジェリストさん達のセッションはやはり面白い。
今回は「センサー」「アジャイル」「WindowsMobile」と聞いてきたんだけど、色々な意味でも面白かったw アジャイルのセッションをやっていた長沢さんのヤツは2部構成だったんだけど、2部目は別セッションのため参加できず。資料だけもらってきましたわ。

今回一番心に残ったのは、
「WindowsMarketPlaceでアプリを公開すると目につきます!・・・なぜなら(まだ)数が少ないから!」と、自嘲気味に話してくれた事だろうかw

ちなみに当方はTDD知っている人に手を挙げた二人のうちの一人ですw

2009年10月8日木曜日

JPC2009札幌 マイクロソフトパートナーカンファレンス2009

久々にイベントのため外出!
マイクロソフト系のイベントはできるだけ出席するようにしていたんだけど、今年や去年は殆ど参加してなかったんだよねぇ。久々だったのでいい刺激になりました。

昔、営業窓口だった方がいつのまにやら支店長に。びっくりしたなぁ。
多分相手方はこっちの事忘れているだろうけどねぇw

その方が、「あるイベントで隠し玉を用意しています」なんていうから、もうw
思わずそっちも参加登録しましたw
隠し玉については恐らく公表してはいけないっぽいので、イベント後までは内緒みたい・・・。

ま、もともとそのイベントはエバンジェリストの方も多数来るので、マジメに聞きに行きたかったヤツなので・・・。ふんぎりをつけるいいきっかけだったな。

2009年10月5日月曜日

SqlServer CompactEditionでテーブル一覧取得

忘れないようにのメモとして。

SqlServer CompactEditionだとストアドの類がないので主キー情報を取得する SP_KEYS 等は利用できない。こういう場合は情報スキーマ[INFORMATION_SCHEMA]を利用して取得する。このあたりは2005以降のSqlServerと一緒

  • テーブル一覧取得

SELECT * FROM INFORMATION_SCHEMA.TABLES

  • 項目一覧取得

SELECT * FROM INFORMATION_SCHEMA.COLUMNS

WHERE TABLENAME = ‘テーブル名’

  • 主キー情報取得

SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = ‘テーブル名’

とりあえずはこのぐらい。

2009年10月2日金曜日

DataGridViewでアンバウンド時にソート

過去にもちろちろ書いておいたんだけど、修正が発覚したのでw

DataGridViewでアンバウンド時にソートしようと思うと、標準機能だけでなくSortメソッドを利用したソートを行う事が必要になるんだよね。んで、その際には実際に判断を下すためのIComparerインターフェースを継承したクラスを用意すると手軽にいけるのよ。

その際、Compareメソッドをオーバーライドして2値の比較結果を算出するようにするんだけど、その際にちょっと考慮する必要がある事が。

AセルとBセルの値においては「値が無い」状態が数種類存在する

ここなんだよねぇ。具体的にはNothingとDBNullなんだけど、Nothingは「比較対象がない」場合と「比較対象のセルに値がない」場合、でDBNullは「比較対象のセルの値がDBNull」という場合。なので実際にはこういったロジックになるんじゃなかろうか。

Dim originalCell As DataGridViewCell = TryCast(originalRow.Cells(sortChild.ColumnIndex), DataGridViewCell)
Dim comparedCell As DataGridViewCell = TryCast(comparedRow.Cells(sortChild.ColumnIndex), DataGridViewCell)

If ((originalCell Is Nothing) OrElse (originalCell.Value Is Nothing) OrElse (IsDBNull(originalCell.Value))) AndAlso _
   ((comparedCell Is Nothing) OrElse (comparedCell.Value Is Nothing) OrElse (IsDBNull(comparedCell))) Then
    Continue For ‘セルの値は同じ
End If

多分こんな感じ。ソース中で「セルの値は同じ」場合にContinueしているのは深読みしてくださいw

2009年9月25日金曜日

気持ちは分かるけど・・・

転職活動をする暇があったらブログを書け - @IT自分戦略研究所

有名所の人がITエンジニアの転職市場の話を書いているんだけど・・・。
んー、正直微妙というか何というか。

小飼さんの言わんとするところも分かるんだけどねぇ。なんかそのやり方は、都心部というか人が多く集まっている場所とか、大きい企業とかそういうところにしか通じないんじゃないかなぁ、と思うんだよな。

少なくとも中小~零細企業においてITエンジニアがブログ書いていようが、Twitterしてようがまず間違いなく見る事はないだろうし。たかだか3カ月程度Blogを書き続けた程度で人の目につくかどうかなんて、よほどの中身が書ける人に限定されるわなぁ。

逆に、そういった人の目につくことができるネタでBlogできるくらいだったら小飼さんの言う通り、職にあぶれることもないだろうね。というか特に悩むことなく転職できるような人だと思うわw

2009年9月19日土曜日

フルテキスト検索設定用のストアドプロシージャ

前回同様面倒くさくなったのでストアド化させたw
カタログの削除・生成とインデックスの削除・生成用のサンプルとして。

/*
特定のテーブルにおけるフルテキストインデックス、フルテキストカタログを再作成する
*/
ALTER PROCEDURE CREATE_FULLTEXTCATALOG(@tableName NVARCHAR(MAX))
AS
BEGIN

  DECLARE @CRLF NVARCHAR(2);
  SET @CRLF = CHAR(13) + CHAR(10);

  DECLARE @INDEXCOUNT     INT;
  DECLARE @DBNAME         NVARCHAR(MAX);
  DECLARE @CATALOGNAME    NVARCHAR(MAX);
  DECLARE @COLUMNTYPE     INT;
  DECLARE @COLUMNNAME     NVARCHAR(MAX);
  DECLARE @INDEXNAME      NVARCHAR(MAX);
  DECLARE @PRIMARYKEYNAME NVARCHAR(MAX);
  DECLARE @TARGETCOLUMN   NVARCHAR(MAX);
  DECLARE @EXECUTESQL     NVARCHAR(MAX);

  --実行データベース名を取得
  SET @DBNAME = DB_NAME();

  --フルテキストカタログ取得
  DECLARE CUR_CATALOG CURSOR LOCAL FORWARD_ONLY FOR
    SELECT
      SFC.NAME CATALOGNAME
    FROM
      SYS.FULLTEXT_CATALOGS SFC
        INNER JOIN SYS.FULLTEXT_INDEXES SFI ON (SFC.FULLTEXT_CATALOG_ID = SFI.FULLTEXT_CATALOG_ID)
          INNER JOIN  SYS.TABLES STS ON (SFI.OBJECT_ID = STS.OBJECT_ID)
    WHERE
      STS.NAME = @tableName;

  --対象テーブルのフルテキスト対象項目取得
  DECLARE CUR_TABLE CURSOR LOCAL FORWARD_ONLY FOR
    SELECT
      SC.SYSTEM_TYPE_ID,
      SC.NAME
    FROM
      SYS.COLUMNS SC
        INNER JOIN SYS.TABLES STS ON (SC.OBJECT_ID = STS.OBJECT_ID)
    WHERE
      STS.NAME      = @tableName AND
      SC.MAX_LENGTH = -1;

  --対象テーブルのプライマリキー取得
  SET @PRIMARYKEYNAME = '';
  SELECT
    @PRIMARYKEYNAME = SI.NAME
  FROM
    SYS.TABLES ST
      INNER JOIN SYS.INDEXES SI ON (ST.OBJECT_ID = SI.OBJECT_ID
  WHERE
    ST.NAME = @tableName AND
    SI.TYPE = 1;

  --既存フルテキストインデックスの削除
    SELECT
      @INDEXCOUNT = COUNT(*)
    FROM
      SYS.FULLTEXT_INDEXES SFI
        INNER JOIN SYS.TABLES STS ON (SFI.OBJECT_ID = STS.OBJECT_ID)
    WHERE
      STS.NAME = @tableName;

    IF @INDEXCOUNT > 0
      BEGIN
        SET
@EXECUTESQL = 'DROP FULLTEXT INDEX ON ' + @tableName;
        EXECUTE (@EXECUTESQL);
        PRINT @EXECUTESQL + @CRLF;
      END;

  --既存のフルテキストカタログの削除
  OPEN CUR_CATALOG;
  FETCH NEXT FROM CUR_CATALOG INTO @CATALOGNAME;
  WHILE (@@FETCH_STATUS = 0)
    BEGIN
      SET
@EXECUTESQL = 'DROP FULLTEXT CATALOG ' + @CATALOGNAME;
      EXECUTE (@EXECUTESQL);
      PRINT @EXECUTESQL + @CRLF;

      FETCH NEXT FROM CUR_CATALOG INTO @CATALOGNAME;
    END;
  CLOSE CUR_CATALOG;
  DEALLOCATE CUR_CATALOG;

  --フルテキストカタログの新規作成
  SET @EXECUTESQL = 'CREATE FULLTEXT CATALOG FTC_' + @DBNAME + '_' + @tableName;
  EXECUTE (@EXECUTESQL);
  PRINT @EXECUTESQL + @CRLF;

  --フルテキストインデックスの新規作成
  SET @TARGETCOLUMN = '';
  OPEN CUR_TABLE;
  FETCH NEXT FROM CUR_TABLE INTO @COLUMNTYPE, @COLUMNNAME;
  WHILE (@@FETCH_STATUS = 0)
    BEGIN
      IF
@TARGETCOLUMN <> ''
        SET @TARGETCOLUMN = @TARGETCOLUMN + ', ';
      SET @TARGETCOLUMN = @TARGETCOLUMN + @COLUMNNAME + ' ';
      IF @COLUMNTYPE <> 231
        SET @TARGETCOLUMN = @TARGETCOLUMN + 'TYPE COLUMN EXTENSION ';

      SET @TARGETCOLUMN = @TARGETCOLUMN + ' LANGUAGE Japanese';

      FETCH NEXT FROM CUR_TABLE INTO @COLUMNTYPE, @COLUMNNAME;
    END;
  CLOSE
CUR_TABLE;
  DEALLOCATE CUR_TABLE;
  SET @EXECUTESQL = 'CREATE FULLTEXT INDEX ON ' + @tableName + '(' + @TARGETCOLUMN + ')' + @CRLF
                  + ' KEY INDEX ' + @PRIMARYKEYNAME + @CRLF
                  + ' ON FTC_' + @DBNAME + '_' + @tableName + @CRLF
                  + ' WITH CHANGE_TRACKING AUTO' + @CRLF;
  EXECUTE (@EXECUTESQL);
  PRINT @EXECUTESQL + @CRLF;

  PRINT 'フルテキストカタログ、インデックスの生成を行いました。ログのダンプを行った後に有効となります。';

END;

2009年9月18日金曜日

IDENTITY設定用のDELETE時トリガ自動生成

毎回テンプレートから起こしているのが面倒になったので、一括生成用プロシージャを作ってみた。システム管理テーブルから、トリガ一覧の取得やテーブルの項目一覧取得などを使っているので、ちょちょいと変更していけば結構使いではある・・・かもw

--
--全てのテーブルにてIDENTITY値を調整するためのDELETEトリガを再生成する
--
ALTER PROCEDURE UP_CREATE_ALLDELETETRIGGER
AS
BEGIN

  --ワーク設定
  DECLARE @EXECUTESQL NVARCHAR(MAX);
  DECLARE @CRLF NVARCHAR(2);
  SET @CRLF = CHAR(13) + CHAR(10);

  --現在のトリガ一覧を取得
  DECLARE @OLDTRIGGERNAME NVARCHAR(MAX);
  DECLARE @TRIGGERCOUNT   INT;
  DECLARE CUR_TRG CURSOR LOCAL FORWARD_ONLY FOR
    SELECT
      ST.NAME,
      (SELECT COUNT(*) FROM SYS.TRIGGER_EVENTS STE2 WHERE STE2.OBJECT_ID = ST.OBJECT_ID) TRIGGERCOUNT
    FROM
      SYS.TRIGGERS ST
        INNER JOIN SYS.TRIGGER_EVENTS STE ON (ST.OBJECT_ID = STE.OBJECT_ID)
    WHERE
      ST.PARENT_CLASS = 1     AND  --対象の親    :DML トリガ用のオブジェクトまたは列
      ST.TYPE         = 'TR'  AND  --対象の種類  :トリガ(TR)
      STE.TYPE        = 3     AND  --イベント種類:DELETE時
      ST.NAME NOT LIKE '%#__FULLTEXT' ESCAPE '#' AND --フルテキスト用トリガの除外
      ST.NAME NOT LIKE '%#__SEARCH' ESCAPE '#'       --検索データ用トリガの除外
    GROUP BY
      ST.OBJECT_ID,
      ST.NAME   
    ORDER BY
      ST.NAME
    ;

  --既存トリガの削除
  OPEN CUR_TRG;
  FETCH NEXT FROM CUR_TRG INTO @OLDTRIGGERNAME, @TRIGGERCOUNT;

  WHILE (@@FETCH_STATUS = 0)
    BEGIN
      --DELETE時のみのトリガを削除
      IF @TRIGGERCOUNT = 1
        BEGIN
          SET @EXECUTESQL = 'DROP TRIGGER ' + @OLDTRIGGERNAME + '' + @CRLF;
          EXECUTE (@EXECUTESQL);
        END;

      FETCH NEXT FROM CUR_TRG INTO @OLDTRIGGERNAME, @TRIGGERCOUNT;
    END;

  CLOSE CUR_TRG;
  DEALLOCATE CUR_TRG;

  --テーブル一覧、IDENTITY列一覧を取得
  DECLARE @TABLENAME NVARCHAR(MAX);
  DECLARE @COLUMNNAME NVARCHAR(MAX);
  DECLARE CUR_IDENT CURSOR LOCAL FORWARD_ONLY FOR
    SELECT
      ST.NAME,
      SC.NAME
    FROM
      SYS.COLUMNS SC
       INNER JOIN SYS.TABLES ST ON (SC.OBJECT_ID = ST.OBJECT_ID)
    WHERE
      SC.IS_IDENTITY = 1
    ORDER BY
      ST.NAME, SC.NAME
    ;

  --新トリガの生成
  OPEN CUR_IDENT;
  FETCH NEXT FROM CUR_IDENT INTO @TABLENAME, @COLUMNNAME;

  WHILE (@@FETCH_STATUS = 0)
    BEGIN
      --トリガSQLを生成
      SET @EXECUTESQL = 'CREATE TRIGGER TRG_DEL_' + @TABLENAME + @CRLF
                      + '  ON ' + @TABLENAME + @CRLF
                      + '  AFTER DELETE ' + @CRLF
                      + 'AS ' + @CRLF
                      + 'BEGIN ' + @CRLF
                      + '  ' + @CRLF
                      + '  SET NOCOUNT ON;' + @CRLF
                      + '  ' + @CRLF
                      + '  DECLARE @COUNT INT;' + @CRLF
                      + '  SET @COUNT = 0;' + @CRLF
                      + '  SELECT @COUNT = COUNT(*) FROM DELETED;' + @CRLF
                      + '  IF @COUNT <= 0' + @CRLF
                      + '    RETURN;' + @CRLF
                      + '  ' + @CRLF
                      + '  DECLARE @MAXIDENT INT; ' + @CRLF
                      + '  SELECT @MAXIDENT = MAX(' + @COLUMNNAME + ') FROM ' + @TABLENAME + ' WITH (UPDLOCK);' + @CRLF
                      + '  IF @MAXIDENT IS NULL ' + @CRLF
                      + '    SET @MAXIDENT = 0;' + @CRLF
                      + '  DBCC CHECKIDENT (''' + @TABLENAME + ''', RESEED, @MAXIDENT) WITH NO_INFOMSGS; ' + @CRLF
                      + ' ' + @CRLF
                      + 'END; ' + @CRLF;
      EXECUTE (@EXECUTESQL);

     FETCH NEXT FROM CUR_IDENT INTO @TABLENAME, @COLUMNNAME;
    END;

  CLOSE CUR_IDENT;
  DEALLOCATE CUR_IDENT;

END;

2009年9月14日月曜日

WindowsXPの修復インストール

自宅PCのUSB環境が理由不明でおかしくなったので、修復インストールを行う事に。

ウチはXPといってもMCE2005で媒体が2枚なんだけど、とりあえずはそれほど問題なくできるかな・・・と思いきや。
修復インストール中に色々他の媒体を要求されるんだねぇ。

XPのSP2とかを要求されたけどそんな媒体はねぇw
.Net周りでレジストリ登録失敗とか出るけどどうしようもねぇww

結局クリーンインストールすることに・・・まぁその分環境綺麗になったけど、これから使っていたソフトの再インストールだ。手間だなぁ・・・。

2009年9月9日水曜日

OpenXML形式の調査

もう時間が全然ないので調査が一向に進まないけど、忘れないためにもメモ。

Open XML オブジェクト モデルを使用して Excel 2007 ファイルおよび PowerPoint 2007 ファイルを操作する (パート 1/2)

Open XML オブジェクト モデルを使用して Excel 2007 ファイルおよび PowerPoint 2007 ファイルを操作する (パート 2/2)

今利用しているライブラリも全然修正が進んでいないから、シートの追加削除がバグってるしなぁ。はやいところ時間作って対応せな。

2009年8月27日木曜日

Windows UX ガイドライン

Windows7対応版ということで提供されていた。

Windows ユーザー エクスペリエンス ガイドライン

で、ローカルで読みたかったのでPDF版をDLしてみたんだけど、どうやらた一部ハイパーリンクが間違っている模様。

http://hiroyuk1/~といったアドレスになっているんだよなぁw
きっとこれはレアだな!w

2009年8月26日水曜日

DenpyoManとDataGridView

社内で講習会なぞをやっているので、VB6・VB.Net共に調べたり話したりすることがそれなりにあるんだけど、グリッド系コントロールはどれもこれも基本思想としては一緒な気がしているんだよね。

異なるのはUIデザイン部分が殆どで、大枠としての制御(値の使い方等)はそんなに違いがないように思えるなぁ。DataRepeaterだって、細かい部分は異なっても大枠の制御は似たようなもんだし。

この部分で違う設計が思いつけば意外とイケるコンポーネントにできるかも。

どうもグリッドという物自体に行き詰まりを感じる・・・

2009年8月21日金曜日

ブログクラブに登録しました

どういう使い方ができるかどうかは、まだ見えていませんが

ブログクラブ

に登録してみました。ここと、@ITのコラム、そしてTwitterアカウントが登録してあります。

2009年8月15日土曜日

移行完了ー

ようやっと複数箇所に分散していたヤツを移行終わりました。

HPでやっていた内容が一番何というか・・・変に重いなw
まー、記録として残しはじめたのが2000年からだし(実際は1998年からなんだけど・・・まぁ扱っていたネタが今と全く違うんで)それなりに懐かしい話題が多かったなぁ。

書いていた内容がマズイので移行できないのもあるのが残念だけど。
さすがに固有名詞入っているのはねぇw

2009年8月12日水曜日

DataGridView.CheckBoxCellのApprearance

DataGridViewのCheckBoxセルにはApprearanceプロパティがないのね・・・。

使ってみようと思ったんだけどなぁ。自前で用意か。

2009年8月3日月曜日

MCA受講者限定特典

MSからのメールでそんなのが届いていたので見てみると、
過去にMCAを受験した人限定で、MCA受験料20%OFFになるとのこと。

・・・あー、俺MCA Masterだからなぁ。

つかMasterの特典ってのが殆どない気がするんだが、気のせいだろうか?w

2009年7月31日金曜日

ログイン中ユーザーに対して「次回ログイン時にパスワード変更を」なんぞすると

ログインしているユーザーに対して、「次回ログイン時にパスワード変更を要求する」なんてやると、 PCのロック解除などの際に「パスワードの有効期限が切れています」となり、どうにもならない状態にw

偶然見つけたとは言え、状況的に面白かったw

2009年7月22日水曜日

IE互換ブラウザとSilverlight

最近までは問題なく使えていたと思っていたんだけど・・・。
気がつくとSleipnir2+IE8環境でSilverlightモノが「対象外です」と言われて見えない・・・orz

IE8単独では動作したので、プラグイン側でなんか判断しているんだろうなぁ。

記憶が間違っていなければ、昨日だか今日にSilverlight3とかで更新パッチが流れていたから、多分このあたりなんじゃないかな、なんて。

Yahooの立ち読みもそうなんだけど、世の中互換ブラウザに厳しいわ・・・。

2009年7月15日水曜日

Microsoft Office 2010 Technical Preview

Microsoft Connectから申し込んでおいたんだけど、無事認証されたようだったので現在色々ダウンロード中。

今回は検証環境としては

  • Windows7
  • WindowsXP

を考えているんだけど、XP環境を用意するの面倒だなぁ・・・。

ま、できるだけ時間を作って検証していかないとな。

2009年7月14日火曜日

Windows Home Serverプレゼントキャンペーン

Windows Home Server 搭載サーバー プレゼント! | マイクロソフト

ちょっと興味をもったので覗いてみたら、抽選で1名というのと・・・

「抽選で50名様にハローキティぬいぐるみプレゼント!」

 

・・・ああ、これはきっとアレだ。
烈海王みたいに「私は一向にかまわんッ!!」と言い切れる強さを持つ猛者だけを対象にしているキャンペーンなんだ、きっと。

応募する勇気が持てねぇw

2009年6月19日金曜日

XP Mode検証用PC・・・

社内で稟議あげてXP Mode検証用PCを一台確保してもらった。

Core2Duo E8400
メモリ 4GB
HDD 500GB
グラフィック GeForce GT120

・・・現在のウチの社内でサーバ、クライアント通して一番いいスペックになりましたw

なんだかなぁ・・・orz

2009年6月18日木曜日

VistaでXP Mode?

盲点というか考えてもいなかった事だったなぁ。

Shigeya Tanabe's blog : [Win7 Tips] XP Mode の Vista 版!? ~Windows Virtual PC~

VistaのUltimateかEnterpriseであればWindows Virtual PCが利用できてなおかつ、XP Modeの特徴であるシームレスな仮想アプリケーションの利用が行えるそうで。

考えてみればXP Mode自体別にWindows7でなければいけない、という機能はないっぽいから十分Vistaでも動作しそうだったんだよね。これで企業のVista導入も増えればいいとは思うけど・・・。

ネックなのはUltimateかEnterpriseというエディションの条件か。
実際としてはBusinessを導入している(する)企業が割合多いと思うんだけどなぁ。

2009年6月15日月曜日

ハードウェア構成見積の不思議

ある案件でクライアントの入れ替えを提案するもので、web上での構成見積もりを行っていると。

メモリ 1GB(PC3-8500) ¥5,000

メモリ 1GB(PC3-8500)*2 ¥15,000

メモリ 1GB(PC3-8500)*4 ¥35,000

どういう計算をすればこういう価格になるんだか・・・?
まとめて購入すればするだけ割高になるってw

2009年5月29日金曜日

これはスゴイ・・・仕事術

マイクロソフト 世界最強の仕事術 - Windows Live

MSDNやTechNetのBlog一覧とか、エバンジェリストな人もお勧めする、仕事のやり方について「実践的」「実際の話」「面白い(w)」書いてくれているBlog。

これをみるとOneNoteを導入したくなること間違いないw

イヤ、マジでほしくなる・・・。なんというか仕事の管理と進め方について、具体的な方法を示してくれているのがなんともスゴイ。
仕事上そういったタスク管理とかのシステムを作ることもあるし、現実に自分の仕事の管理などで問題や不満を感じる事も多いからなおさらためになったなぁ。

北海道にもセミナーに来てくれれば絶対参加するんだけど・・・。

2009年5月19日火曜日

NEC Express5800/110Ge・・・

なんで本家(NEC)からのリリースない状態なのに、NTT-Xのオンラインストアで Windows2008 FoundationServerバンドルモデルが出てきているんだろーか・・・。

しかし特典が・・・うわぁw

最小環境でのSqlServer2005セットアップ

都合色々あって、Pen4 3GHzだけどメモリ512Mという環境にSqlServer2005をセットアップすることに。
後で調べてみたんだけど、メモリ512Mというのは必須環境というか最低ラインだったみたいで。

でインストールを行っていると途中でフリーズする事例が発生w
しかもSqlServerエンジンとかでなくBooksOnlineでwww

BooksOnlineのセットアップをしないようにすれば、何とか流れたよ・・・。
本体のセットアップより重いってのはどういうことなんだか。

2009年5月12日火曜日

Windows Share Point Services3.0 SP2 と Search Server 2008 Express

どうにもパッチの適用方法が複雑で困ったのがこのあたり。
SearchServer系もSharePointService利用しているので「ある程度」は一緒にあたるかと思っていたんだけどなぁ。

Microsoft Office Servers のインフラストラクチャ更新をインストールする (Search Server 2008)

を見ながらやってみたんだけど、やはりというか玉砕。
色々復旧を試みているうちにさらにカオスな状況になったので、全てアンインストールw
その後最初からSP2版をインストールして再構築。

・・・いやぁ、SearchServerExpressのSP2についてもう少し詳しい資料が見つかっていれば問題はなかったんだろうけど。
SharePoint系だけどOfficeServer系のパッチだしなぁ、コレ。でも「でもどっちもあてろ」的な雰囲気が難しいw

2009年5月8日金曜日

Windows7 RC版でVB6製アプリケーションの動作

ViryualPC上で今回も環境を用意してみたので一通り動作確認。
相変わらずTabCtl32.ocxとMsflxgrd.ocxがレジストリ登録周りで失敗しているくせに、何事もないかのように進んでしまい少々ハマっただけでとりあえずは問題なさそう。

一応自分で手掛けているシステムだけ確認したけれど、その際に利用していたサードパーティ製ツールはこれ。

  • DenpyoMan 1.5
  • ActiveReport 1.5

一応この二つは問題なく動いている様子。これで一安心かな・・・。

GrapeCity製品で問題あるのは、自分が関わっている中ではInputMan6.5だけかな。
自分のプロジェクトでは利用していないけど、どうやらこれのIME制御関係とメニュー関係のocxで問題が出る様子。
でもInputManとDenpyoManってIME制御同じことやっていると思っていたんだけどなぁ。

今のところ自分のプロジェクトのDenpyoMan利用箇所では問題ないんだよね。

・・・これでXP Modeでなくても大丈夫とわかって一安心だw
使ってはみたいんだけどねぇ。

2009年4月30日木曜日

Windows7のWindows XP Mode(2)

色々調べていく内に、他のサイトで言及していたHW要件の話が目につくようになってきた。 AMDはいいんだけどIntel系が・・・。

Intel-VTという仮想化技術を搭載したCPUとなると、Xeon5000番台、同じく7000番台はまだいいとして、クライアント側が厳しい。

Core2DuoではE6000、E8000。Core2QuadではQ6000、Q9000。そしてCorei7。
現在ビジネスPCでまだ出回っているCore2DuoのE7000台は未対応というのが厄介。 ま、CeleronやPentiumのデュアル物はしょうがないとしても。

Windows7導入時のHWにはちょっと気をつけないとくらってしまいそうだなぁ・・・。

素直にWindows7用システムに刷新できれば何の問題もないんだけど、そんなことができるケースなんて仕事上少ないわな。

2009年4月27日月曜日

Windows7のWindows XP Mode

あー、なんというかやっぱりこういう形になってきたか、というのが正直なところ。

結局一部のWindowsXPから乗り換えられないユーザー、ベンダーの為に仮想化されたXPを標準提供しようということなんだよね。

ぱっと見た目はAPP-Vというか、VirtualPCのように「いかにも仮想化です」という雰囲気がないのでいい感じはするw

実際にベータがリリースされたら確認はするけど、APPからストレージ(ローカル環境)にアクセスする際に、何か気をつけないといけない点があるような気がするなぁ。XPからVistaに変化した際に一躍有名になったローミングとか、一部フォルダのリダイレクトとかをもう一度チェックしないといけないのかな?

2009年4月23日木曜日

Windows Server 2008 Foundation

昨日(4/22)あたりに発表になっていた、低価格なWindowsServer。
提供形式がOEMのみなのでメーカー製PCに限定されるとはいえ、しょっぱなに発表されたDELLのモデルが最小構成で\54,800円だかそのあたりという、本当にクライアントPCと変わらない価格帯なので、今後続く日本のメーカーからも近いレベルでの提供になるんじゃないかと・・・。

詳しくはよく調べられていないので何とも言えないんだけど、15人以下という制限は確かに小規模な会社には丁度いい感じ。
ただちょっとだけ気になった点が「既存ActiveDirectoryへ組み込むのは推奨されない」というところかな。

まぁライセンス形態が別物だから面倒になるってことなんだろうけど・・・。

使えるようだったら仕事で使いたいねぇ。
今の仕事のメインターゲット層に思い切りマッチしているから。

2009年4月21日火曜日

SharePoint Designer2007がフリー化

今月の頭(4/1)から無償化されていたとは知らなかった・・・。

SharePointServiceは少しずつ触っていたので「欲しいなぁ」とずっと思っていただけに結構嬉しいね。
まずはワークフローあたりを試し試し触って使い込んでみるかな。

それによっては自前で作る必要が大分減るからなぁ。

2009年4月3日金曜日

WinFormsでOffice2007のリボン

CodeProject: A Professional Ribbon You Will Use (Now with orb!)

CodeProjectで以前よりあったんだけど、全然知らなかった。
WPFでも同じようにリボンインターフェースを~、というのは知っていたんだけど、WinFormsでというのは初めて見つけたんだよね。

Demoも含めてソース一式ダウンロードしてみて見てみると・・・。

いやぁ、これはスゴイ。本当に2007OfficeSystemだ。Coolだなぁ。

実際に利用するにはOfficeUIのライセンス登録が必要なんだけど、アレって確か登録する際に「利用する商品名」のような欄があった気が・・・。前に登録しようとした時は、そういう項目があったんでパスしたんだけどなぁ。

日本版として契約内容変えてくれないものかなぁ。

2009年3月17日火曜日

DataRepeater.ItemTemplate内部でのTabIndex

アンバウンドで使いたいがためにカスタマイズ中w
色々手を入れていると少々気になる挙動が。

デザイン時にコントロールをドロップして、ItemTemplateに追加するんだけどこの時各コントロールのTabIndexは重複できるんだねぇ。今までは重複不可と思っていたんであまり意識しないで順番につけていたんだけど。

EnterキーをTabに変換するようDataRepeater.ProcessDialogKeyメソッドをオーバーライドしてみたんだけど、デザイン時にTabIndex=0としておいたコントロールが、何故だか一番最後にフォーカスを得るようになってしまうんだよね。ItemTemplate内部ではちゃんと0オリジンで設定されているんだけど、実際に表示されているカレントアイテム内部ではTabIndex=0のコントロールのTabIndexが末尾のインデックスに置き換わっていたんだよねぇ。

最初は自分が追加したロジックを疑っていたんだけど、TabIndexなんて調整しないからなー、と試しに試してようやく現象発覚。

デザイン全部直してもらうなんてのも大変なので、とりあえずどこかのタイミングでTabIndex再調整ロジックが動くようにしておけばなんとかなるかな・・・?

多分行ヘッダが追加された時に再割り当てされているんだとは思うんだけど・・・。

2009年3月13日金曜日

Visual Studio 2005 Express 終了

2009-3-31にてついにVisualStudio2005ExpressEditionの提供が終了ということで。

考えてみたら自分が触り始めたのはベータ2のころからだから、かれこれ5年になるんだなぁ。
とりあえずisoイメージだけは何かと使うかも知れないのでダウンロードしておかないと・・・。

つか、会社よ。MSDNサブスクリプション入ってくれw

2009年3月6日金曜日

SqlServer2005 空パスワードアカウントの有効・無効

まぁ深くセキュリティを考えなくていいシステムの場合にはよくあるのがパスワードなしアカウント。 今回そういったシステムのハードウェア移行を行った際に少しあたふたしたので・・・。

ログインアカウントをManagementStudioでスクリプト化して、新サーバの方で実行するとアカウントは無効状態で登録されるんだよね。ManagementStudioの詳細画面でアイコンの右下に赤矢印がついているような感じで、無効を表しているんだよね。

で、そういったアカウントを有効にしようとアカウントのプロパティから「有効」にしてみたところ、

「空パスワードなアカウントを有効にすることはできません」(メッセージうろおぼえw)

と言ってきたんだよ。なので一度適当なパスワードを設定し状態を有効に再設定、その後パスワードを空白にすると今度は処理が通ってしまったわけだ。

・・・なんというか片手落ちだよなぁw

2009年3月4日水曜日

SqlServer2005 SP3でのDBCC CHECKIDENT

今まで開発にはSqlServer2005のSP2を利用していて、IDENTITYが設定されたテーブルのDELETEトリガにSEEDの再設定を行うものを仕込んでいたんだよね。こんな感じに。

DECLARE @MAXIDENT INT;
SELECT @MAXIDENT = MAX(SAMPLEUID) FROM SAMPLE_TABLE;
DBCC CHECKIDENT ('SAMPLE_TABLE', RESEED, @MAXIDENT);

今まではこれで問題なくSEEDの再設定が行えていたんだけど、今回SP3を適用して確認しているときに問題が発生。DBCCの部分でパラメータ不正的なエラーになっていたんだよね。少し詳しく見ていくと次のようなケースで発生していたみたいで。

  • DBCCを行うテーブルにレコードが1行も存在しない時

この場合にはDBCC CHECKIDENTがエラーとなるように動きが変わったんだよなぁ。ただ正直言ってSP3で何が変更されたとか、もともとこの方法がまずいだとかまで調べないでやっていたものだから何とも断定できないけれども。でもSP2環境では問題なく動いていたのは事実。
今回は次のように対応することでSEEDの再設定が行えました。

DECLARE @MAXIDENT INT;
SELECT @MAXIDENT = MAX(SAMPLEUID) FROM SAMPLE_TABLE;
IF @MAXIDENT IS NULL
  SET @MAXIDENT = 0;
DBCC CHECKIDENT ('SAMPLE_TABLE', RESEED, @MAXIDENT);

DBCCする前に、取得したIDENTITY値がNullかどうか判断してNullならば「0」をSEEDに設定すればOK。

2009年2月25日水曜日

続 SqlServer2008 ManagementStudioExpress

使い始めて大きいところでは全然問題ないんだけど、細かいところでストレスが。

クエリを実行するとその後必ずIMEがONに戻るんだよなぁ・・・。

どこか設定ないものかと見てみたけど、それらしい設定は見えないし。
んーむ、これはなんとかならんもんかなぁ。

なんとかならないなら2005に戻すかもw

2009年2月24日火曜日

SqlServer2008 ManagementStudio Express

ダウンロード情報として公開されていたので自前の環境にいれてみた。

インストールのダイアログがなんというかSqlServer2008系で統一した感じに。正直面倒が多くて使いづらいw
こっちはManagementStudioExpressをインストールしたいってのに、GUIの雰囲気としてはSqlServer2008のインストールにしか見えないんだよねぇ。

それとインストールするにはSqlServer2005のManagementStudioExpressはアンインストールしないとできなかったんだよな。ここもちょっと面倒だった・・・。

そのくせインストールが終わって初起動させると、「ManagementStudio2005から設定をインポートすることができます」と聞いてくる。もうアンインストールしたというのに設定だけは残っているのかね?

まぁそれ以外については2005までとほぼ同様なので特に問題はないね。
Express版は今まで利用できなかった標準レポート(使用容量とかそういうヤツ。Stander以降は提供されていた)が今回から利用できるってのは嬉しいポイントだわ。

たぶん自分の開発では入れ替えておいてもなんら困るところがなさそうなのでしばらくこのまま2008で行ってみるかなw

2009年2月13日金曜日

Eclipse Process Framework

プロセス管理というか開発標準というかそういうジャンルな話を調べていると出会ったのがこれ。とりあえずインストールを行ってみて色々触ってはいるのだけれど、元々の知識不足がたたってかものすごく難しくものすごくわからないw

Eclipse周りも全然詳しくないので最新版の1.5.x系統の日本語化ができなかったので、仕方なく1.2.x系統をセットアップしていたり・・・w

これでうまいこと開発標準とかを定義できれば後々楽に質を向上させた仕事ができるとは分かっているんだけどねぇ。勉強しようとは思っても時間が足りません(というかせっぱつまった仕事の合間にこういうことをやっているから時間がないんだけどw)
いや、せっぱつまった時って無性に色々な事に手を出したくなるんだよなぁ。

よくないことだけどね。

とりあえず少しずつでもやっていってみるか・・・。

2009年2月7日土曜日

DataRepeaterにDataGridView その2

調査の為に、素のDataRepeaterを使って明細にDataGridViewを追加してみた。 結果はアウト。

ここから考えるとDataRepeaterというよりもデータバインディングの仕様の感じがするなぁ。今までもっていたイメージは「選択されているレコードに対する子レコード群をリレーションを通じて取得、表示」だと思っていたんだけど、それだとこの状態にはならないよね。

各行のレコードに対する子レコード群を・・・という仕様だったら恐らく望んでいる状態になると思うんだよね。
そうではなくてあくまでもカレント行に対する子レコード群、だから各行に張り付けたDataGridViewでは同じレコードが表示されているんだろうと思った(ついでに同じ動作をするのも恐らくはデータバインディングのせい)。

んー。これはどうしようかなぁ・・・。
感覚としてはバインディングしている値に細工するか、DataGridView側でフィルタ的な動作を持たせてリレーションを使わないバインディングをすれば見た目は同じ感じになりそうなんだよなぁ。

でも何かひっかかっている・・・w

2009年2月5日木曜日

Windows7にVB6アプリ

まぁ職業柄仕方がない(w)のでWindows7ベータ環境にVB6製システムをインストールしてみて動作確認なぞしてみた。今回のシステムはGrapeCity社のDenpyoMan1.5とActiveReport1.5を利用しているのでここらへんの確認もこめてやってみたんだよね。
結果としてはまぁVistaと同様。というよりも、このシステムを作っている時、ある程度考えて作っていたおかげかVistaでの文字入力のトラブルとかファンクションキー利かないよ!ウワァァン!なんてトラブルも全部回避していたので、一応安心w

いやね、社内の他の人達が作ったシステムだと上のトラブルが出ているみたいだからw
ま、作り方の差が出ているわけですが。

ただし、インストールにちょっと問題があったんだよね。このシステムのインストールはVisualStudio Installerで作成していたんであまり心配していなかったんだけど、MsFlexGrid.ocxとTabPage.ocx(名前が怪しいけど、グリッドとタブコントロールの事です)のインストールだけが正常に行われていなく、レジストリ未登録みたいな状態のまま「インストールは正常に終了」となっていたんだよね。うーん、これはWindows7環境がベータだからなのか、それともocxコントロール側の話なのか。

もうちょっと時間をとって手作業で設定してみたり色々確認はする予定。
とりあえずVB6アプリでも「ちゃんと作っていれば」特にトラブルなく動作してくれそうです。

2009年2月3日火曜日

DataRepeaterにDataGridView

いや・・・なんというかそんな事するな、という感じがしないでもないんだけど、DataRepeaterコントロールのテンプレートにDataGridViewを追加してみてうまいこと使えるかどうかやってみようと色々試してみたんだよね。

データバインディングの設定なのかわからないんだけど、今のところはDataSetに設定したリレーション通りにはDataGridViewへ表示されないんだよなぁ。表示されるのはDataRepeater1件目のデータに関連する子データのみ。また、DataRepeater内部のDataGridViewをクリックすると、すべてのDataRepeater明細行に存在するDataGridViewが同じ挙動を示すのでものすごく怪しい見た目にw

ちなみに今回も普通にバインディングしているわけではなく、実装者にはアンバインドで使っている気持にするような拡張を施しているのでそこが原因という気がしないでもない。というか、ほぼそのあたりに原因があるんだろうけどねぇ。

右クリックで行削除とかそのあたりは何とかなったんだけど・・・DataGridViewが絡むとやっぱり苦労するw