ここまでの内容でローカルレポートとなる rdlc ファイルの作成ができたので、次はプレビュー画面を表示させます。といっても大したことはなく、提供されている ReportViewer コントロールを利用することで、WinForms または WebForms であれば簡単に帳票プレビューが行えます。
DataGridView や DataRepeater にこだわりつつ
時代は Workflow Foundation などと言い続けていたら
これからは LogicFlow だろ! と思い始めてきた
色々浅く広くやっていく古い技術者の Blog
2015年9月12日土曜日
2015年9月11日金曜日
ReportViewer の LocalReport を利用する(2)
前のコンテンツの続きです。
今回は Report Builder で作成した rdl ファイル(サーバー用レポートファイル)を編集し、ローカルレポートとして扱えるようにします。
2015年9月10日木曜日
ReportViewer の LocalReport を利用する(1)
ずっと以前にも利用していた ReportViewer ですが、最近また触れる機会が訪れたので備忘録的な意味も込めてまとめておきます。
2012年2月24日金曜日
SQL Server 関係のアクティビティライブラリ
前回のファイル・フォルダ関係ライブラリに続いては、Microsoft SQL Server 用アクティビティライブラリです。これも Microsoft.Activities.UnitTesting ライブラリを利用した、ユニットテストのソースも付属しています。また英語・日本語に対応しています。
2012年1月20日金曜日
SQL Server における既存テーブルへの項目追加処理時間
実運用が始まった後でテーブルに項目追加とかはできるだけ避けたいところですが、のっぴきならない事情があったりして追加せざるを得ない事は多々あるかと思います。その際、どれくらい処理に時間がかかるかというのを事前に計測できれば、利用者に「このぐらいの間重くなるからー」とか「何時まで使えないですー」というアナウンスもできるのですが、実際にどれくらいの処理時間がかかるかを計測するのはかなり難しいところだとも思います。今回は、ある程度のデータ件数を持つテーブルに対して項目を追加し、どの程度の処理時間がかかるかを計測してみました。
2011年5月19日木曜日
SQL Azure ファイアウォール管理 REST API のアクティビティ化
基本的に前回とほぼ同一ですが、SQL Azure のファイアウォール制御(作成・列挙・削除)もアクティビティ化してみました。ファイアウォール制御 API 自体は特に難しいものでもなく、非常に簡単な形式となっています。メッセージ生成が必要なのも新規作成の際のみです。
前回同様ベースとなるクラスから。
2011年5月18日水曜日
SQL Azure Management REST API をアクティビティ化
今回はサーバー管理用の REST API をアクティビティ化してみました。REST API 利用ですので、SDK 等の導入は一切必要ありません。
殆ど似た形になるので今回はベースクラスを作成し、各アクティビティはそれを継承する形にしています。まずはベースとなるアクティビティクラスから。
2011年4月27日水曜日
SQL Server のテーブルを全て CSV 出力するワークフロー
SQL Server でテーブルの内容を CSV 出力する事はそれなりに頻度があるかと思います。大体は BCP 等のユーティリティを利用して行うとか、それをスクリプトにまとめておくとか、そのような形ではないでしょうか。同じことをワークフローでも表現してみました。
今回は次のような流れのワークフローです。
- データベースからテーブル一覧を取得
- テーブルごとにデータを抽出
- 抽出したデータを CSV 出力
テーブル一覧を取得する部分は今回新規に用意したアクティビティですが、それ以外は今までの記事で利用したものとなっています。ロジックはこのような感じです。
1: Imports System.Activities2:3: Public Class GetSQLTableListActivity4: Inherits AsyncCodeActivity5:6: Private Const SQL_GETTABLE = "SELECT * FROM SYS.TABLES"7:8: Property ConnectionString As InArgument(Of String)9: Property Condition As String = ""10: Property TableList As OutArgument(Of String())11:12: Public Sub New()13: Me.DisplayName = "SQL Server のテーブル一覧を取得"14: End Sub15:16: Private Delegate Function GetSQLTableListDelegate(ByVal conString As String, ByVal conditionStrings As String) As String()17:18: Protected Overrides Function BeginExecute(ByVal context As System.Activities.AsyncCodeActivityContext, ByVal callback As System.AsyncCallback, ByVal state As Object) As System.IAsyncResult19: Dim conStr = context.GetValue(Me.ConnectionString)20: Dim asyncGetSQLTableListDel = New GetSQLTableListDelegate(AddressOf GetSQLTableList)21: context.UserState = asyncGetSQLTableListDel22:23: Return asyncGetSQLTableListDel.BeginInvoke(conStr, Me.Condition, callback, state)24: End Function25:26: Protected Overrides Sub EndExecute(ByVal context As System.Activities.AsyncCodeActivityContext, ByVal result As System.IAsyncResult)27: Dim asyncGetSQLTableListDel = TryCast(context.UserState, GetSQLTableListDelegate)28: Dim resultStrings = asyncGetSQLTableListDel.EndInvoke(result)29: TableList.Set(context, resultStrings)30: End Sub31:32: Private Function GetSQLTableList(ByVal conString As String, ByVal conditionStrings As String) As String()33: Dim result As String()34:35: Dim tabList As New DataSet36: Try37: Using sqlConn As New SqlClient.SqlConnection(conString)38: sqlConn.Open()39: 'テーブル一覧の取得40: Dim execSql As String = SQL_GETTABLE41: If conditionStrings.Trim <> "" Then42: execSql += " WHERE name like '%" + conditionStrings + "%'"43: End If44: execSql += " ORDER BY name "45:46: Dim dataAdapter As New SqlClient.SqlDataAdapter47: dataAdapter.SelectCommand = New SqlClient.SqlCommand(execSql, sqlConn)48: dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey49: dataAdapter.Fill(tabList)50: sqlConn.Close()51: End Using52: Catch ex As Exception53:54: End Try55: '結果を String() に出力56: If tabList.Tables.Count > 0 Then57: Dim resultList As New List(Of String)58: For Each childRow In tabList.Tables(0).Rows59: resultList.Add(childRow.item("name").ToString)60: Next61: result = resultList.ToArray62: Else63: result = Nothing64: End If65:66: Return result67: End Function68:69: End Class
SQL Server では SELECT * FROM SYS.TABLES とすることでテーブル一覧が取得できますので、その結果を今回は String の配列として返却するようにしています。
そうして得たテーブル一覧に対して ForEach アクティビティでループ、その内部では取得したテーブル名を元にデータを取得、その結果を利用して ForEach アクティビティで更にループ、以前利用した CSVOutput なアクティビティを利用して1行ずつファイルへと出力しています。
このようにワークフローとして処理を記述すると、スクリプトやツールの知識がなくとも行われている処理内容が非常にイメージしやすくなります。このあたりが Workflow の醍醐味なのではないか、と個人的には思っています。
2011年4月25日月曜日
SQL Server で永続化を行った際のデータ
前回の記事で SqlWorkflowInstanceStore クラスを利用し SQL Server 上に永続化を行う方法を扱いました。その際にどのようにデータが記録されているのかは次のようになります。
テスト用にこのようなワークフローを用意しました。最初に適当な値を入力させ、Delay アクティビティで少し待機、その後値を表示させるというサンプル以外の何物でもないワークフローです。まず、値を入力させる段階ではアイドル状態にさせるようにはコーディングしていませんので、入力せずに放置していても何も値は記録されません。何かしらの値を入力し、Delayアクティビティに遷移した際に初めて SQL Server に記録されます。
ワークフローがアイドル状態になった際に、上記のような結果となります。InstanceTable と LockOwnersTable にデータが記録されているのがわかると思います。InstanceTable には現在実行中のワークフローの情報が、LockOwnersTable にはワークフローの実行者(実行している環境)の情報が記録され、あるワークフローがどこで実行されているかを把握する事ができます。
Delay アクティビティが終了し値の表示が終わり、ワークフロー自体が終了した場合には次のようになります。InstanceTable から値が削除され実行中ワークフロー情報がなくなります。もう一つの LockOwnersTable には情報が残りますが、これは次に何かしらのワークフローを実行した際にも利用されるデータとなっています。毎回データを新規生成する無駄が省かれている形です。
このような形でワークフローの永続化時にデータの保持が行われます。前回の記事で書いた事以外にはコード上での対応はありません。いかに簡単に永続化が行う事ができるかがわかると思います。
2011年4月22日金曜日
SQL Server での Workflow 4 永続化サービス利用の準備
長い時間動作する Workflow には永続化する仕組みが最初から用意されています。またカスタマイズも行えるようになっていますので、ローカルファイルへ~とか行うのも可能です。.NET Framework 4 でも標準で SQL Server にて永続化を行うための仕組みが提供されているので、下準備の方法を書いておきます。
- 永続化用のデータベースを作成する
- スキーマ定義 SQL を実行する
- ロジック定義 SQL を実行する
データベースを作成して提供されている SQL を実行するだけの簡単なお仕事です。
実行するSQLは次のフォルダにあります。
[ Windowsフォルダ ] \ Microsoft.NET \ [ Framework または Framework64 ] \ [ バージョン番号 ] \ SQL \ ja
- スキーマ定義用:SqlWorkflowInstanceStoreSchema.sql
- ロジック定義用:SqlWorkflowInstanceStoreLogic.sql
MSDN では機械翻訳のままのせいなのか SQL \ en フォルダの~と書かれていますが ja フォルダのものを利用して大丈夫です。実行すると 8 個のテーブル、3 個のビュー、19 個のプロシージャ、他にも色々作成されます。
これだけで SQL Server を利用した永続化の下準備は完了です。なお、先日の Platform Update 1 より永続化対象に SQL Azure も加わりました。環境が用意できればここも試してみたいと思います。
2011年3月7日月曜日
Report Viewer 2005・2008・2010
あまりにも予算がないので仕事上は ReportViewer コントロールを利用した帳票しか作成しないんだけど、最近 Report Viewer 2008 を Local Report 表示のために Windows XP 環境で利用していた場合に
2 度目のプレビュー以降で先頭ページが表示されない
というなんとも不可思議な現象が発生していたんだよね。例えば 3 ページある帳票をプレビューすると、2 度目以降はツールバー上も 2 ページしかない扱いになるんだけど、プレビューに表示されている内容をみたところ、先頭ページが抜かされて 2 ページ目以降からプレビューされていた。
さらに物理用紙サイズでのプレビュー(印刷プレビュー)ではなく、論理プレビューにすると元通り 3 ページ表示される。そして、一度他の用紙サイズに変更し(ここでも 3 ページ表示される)、その後元の用紙に戻すと今度はちゃんと 3 ページ分のプレビューが行われる。
結構調べてみたんだけど今のところ対応策見つからず・・・なので Report Viewer 2010 に帳票コントロールを切り替える事で逃げようかな、と。
2010年12月7日火曜日
SQL Server 動的ポート利用時のファイアウォール
デフォルトインスタンスとなる構成で動的ポートはそれほど問題がないんだけど、名前付きインスタンスになると色々と戸惑ったのでメモ。
SQL Server でファイアウォールの設定については大きく分けて二通り。
- プログラムごと許可する
- ポートを設定する
プログラムごとというのは SQL Server の実行プログラム、sqlservr.exe そのものを許可する方法。ものすごく手っ取り早いので多用するw もう一つのポートを設定するというのは、SQL Server 構成マネージャにて設定できるポートを許可するようにファイアウォールを設定しておく方法。通常はこれだけで済むんだけど、名前付きインスタンスの場合はもう少し複雑に。
SQL Server のアクセスを許可するための Windows ファイアウォールの構成 を参照してもらえれば大体わかると思うけど、プログラムごと許可する場合に覚えておいてもらいたいのは、SQL Browser を許可する事。こいつも許可してあれば接続は行えるようになる。
2010年9月13日月曜日
9/8 SQLDO ナイトセミナー
9/8 に SQLDO のナイトセミナーを MS 札幌支店にて行いました。CLR/H に続き SQLDO も夜形式のセミナーということで事前調整などが色々難しかった感じですが、無事開催されて一安心という感じです。上記写真はオープニングロゴなのですが・・・ジニアス作成の SQLDO ロゴが右上に潜んでいるのですが、あまりに色々な意味で危険がいっぱいですのでモザイク処理をかけさせてもらっていますw
ちなみに今回、ジニアスは何かを送付していました。中身はとりあえず謎ということになっています(?)
そして CLR/H のセミナー案内・・・ですが何かがおかしいw
ジニアスの SQL Server 2008 のセッションからスタート。今回はおさらいとして SQL Server 2008、そして R2 を開発者向けに色々と話す内容・・・の予定でした。珍しいことにジニアスが時間配分を間違えてしまい、本題であったはずの R2 についてはナシw しかしそれでも Management Studio で地形データ抽出時の挙動や、ポリシー設定、データ圧縮など数多くの話題をデモ交えて行ってくれたあたり流石です。個人的にポリシーベースでの設定共通化や、ユーザー定義データ型、Date 型や Time 型などすぐにでも利用したい機能が多いのが嬉しいですねぇ。できるならすぐにでも SQL Server 2008 R2 に切り替えたいくらいで・・・。
写真はジニアスと坂井さん。坂井さんは SQL Server のライセンスについて LT、よりは若干多めの内容を話してくれました。仮想化が関係してくると、途端に難解になってしまうライセンス周りをサンプル問題交えて話してくれました。実際に物理コアと仮想コア、そして利用するエディションによって色々と適したライセンスが変わったり、必要となる数が変わったりする難しさが潜んでいますので、このあたりはしっかりと押さえておきたいところ。
そして最後に代表 tenkiさん のセッション、今回も前回から続いてインデックス周りです。プライマリキーとインデックスについて基本から実例をふまえた話で、「あらためて」という部分と「実は」という部分をうまいこと用意してのセッションでした。プライマリキーの設定については色々とためになったなぁ。
今回は宣伝があまり行えずに参加者は十数名でしたが、内容は非常に面白い内容になっていたと思います。しかし次回開催予定が・・・10/2・・・早い、早すぎるw
2010年8月13日金曜日
Report Viewer 2008 を BootStrapper として配布する際の注意
前回のエントリで Report Viewer コントロールのバージョンアップ自体は特に問題なく行えることが確認できたので、ユーザー先の配布用にインストーラを構築していてしばらく困っていたのでメモ。
色々な手段で(w)Report Viewer 2008 のパッケージを用意し、さて必須パッケージとしてチェックしてビルドすればOK、みたいに思っていたらVS上のダイアログに Report Viewer 2008 が表示されてこなかったのよね。
で、とっちゃんさんの助力のおかげで Report Viewer 2008 の product.xml にてProductCode の記述が誤っているのが発覚。何故かここが、
Microsoft.ReportViewer.8.o
となっているけど、これは Report Viewer 2005 の ProductCode と同一なのでVS上で重複として扱われ、結果必須コンポーネントのダイアログに表示されてこなかったという話で。なので対応としては、上記 ProductCode の値を
Microsoft.ReportViewer.9.o
と書き換えてあげればOK。
2010年8月12日木曜日
Report Viewer コントロールのバージョンアップ
今までは 2005 の Report Viewer コントロールで帳票プレビューとか行っていたんだけど、どうしても pdf で文字化けとか解決してくれない問題が放置されていたので、2008 と 2010 の Report Viewer コントロールを利用してみた。
自分の開発用ライブラリで Report Viewer コントロールをラップするような形にしてあるので、うまくいけば再頒布パッケージの導入のみで済むかな、と思って試してみるとこれが成功。
2008 も 2010 もどちらもロジックはそのままで、参照設定のみの変更でいけたw
ちなみに 2010 を利用する場合でも、旧フォーマット(2008 フォーマットでない)rdlc ファイルをそのまま扱えるので、移行する人は配布の事だけ考えればどうにかなりそうです。
2010年7月14日水曜日
SQL Server で大量データを削除した後のメンテナンス
忘れないようにメモメモ。
SQL Server を利用していて大量にデータを削除しサイズを圧縮しようとした場合、単純に削除を行っても小さくならないケースがある。
その場合、プライマリキーを再編成(または再構築)を行うことによってデフラグっぽい事が行われて、未使用領域として設定されるのでその後に圧縮を行うことによりようやくサイズを縮小できる。
消しただけでは圧縮できないケースがある、てのを覚えておかないとねー。
2010年7月13日火曜日
SQL Server で単純モデルを利用していてもログは増える
イメージとして単純モデル=ログを使わないという感覚だったので、間違いを忘れないためのメモ。
実際に作業としてやってみたのが次のような内容。
「データ量が多くなってきたので余分なデータを削除する」
今回は全体として6000万件ほどためこんでいるテーブルから削除を行おうと思ったので、まずは1000万件ほどDELETEしてみる事に。そうするとログファイルが徐々に徐々に大きくなっていくのが目に見えたw
削除が終わってからしばらくしてもldfファイルのサイズが大きくなったままだったので、恐らくの動作はこのような感じだろうか?
「単純モデルでもldfにログを記載する。ただしどこかのタイミングで自動的に切り捨て処理が行われる」
今回は時間があまりなかったので自動的に~という部分は確認できていないけど、これであれば単純モデルでldfはそうそう肥大しない、という状態にはなるのかなぁ、などと思ってみた。
とりあえず、単純モデルだろうと完全モデルだろうとたくさん処理するときはldfやディスクの空き容量は注意しておきなさいよ、という事で・・・。
2010年5月19日水曜日
PowerPivot for Excel 2010 では直接SQLを指定しないほうがいい
最近はPowerPivotがお気に入りなので、色々試している最中に見つかったのでメモ。
最初にデータのインポート元を指定する際、「テーブルやビュー」「SQLで指定」と二通りの方法があるんだけど、ここでSQLを直接指定した場合、データソース上から全件はデータがインポートされずに部分的にインポートされてしまうみたい(1万件のうち500件とか)
この場合の対応は、同一内容でデータベース上にビューを構築すればOK。そうすれば問題なく全件取得可能。
ユーザーに利用してもらう場合、できるだけ要望に見合うビューを用意できるかってとこになるんだろうな。
2010年5月17日月曜日
SQLDO 第一回勉強会
5/15に北海道では初となるSQLServer専門コミュニティ、SQLDOの第一回勉強会があったので参加してきました。一応仕事でSQLServer扱っていつ身なので、どういった話が出てくるのかwktkして行って来ました。
今回は第一回というのもあって、できるだけ深入りしないように入り口をなぞる感じのセッションだったなぁ。tenkiさんのセッションは、初めてSQLServeに関わる人に向けて丁度いい感じで進めることが出来ていたように思えるし。
対して安納さんのセッションは・・・色々な意味で面白かった。
PowerPivotまわりとSSISが主題になった内容だったんだけど、関連してSharePointのPowerPivotギャラリーが出てきたり(残念ながらFoundationではできないそうで・・・)なかなかお目にかかれないものが見れたのと。
「Excelすげぇなぁ」
発言が全てだw
もうその発言を聞いた瞬間、「安納さん、ちょwww」という気分になったねぇ。
次回の日程はまだ決まっていないけど、できるだけ参加したいな。
それも可能であればスピーカーとしてw
2010年1月18日月曜日
Sql Server CompactではIF文が使えない
もぅタイトル通り。
なのでスクリプト内部でデータやオブジェクトの存在チェックして~、という手法が全く使えません。解決策としては・・・それようのAPを用意することくらいなんだよねぇ。
まぁCompactはそういう用途向けだからいいといえばいいな。






