月別アーカイブ: 2010年11月

3 posts

VB to C#

途中まですすめたVB.NETプロジェクトをC#.NETに書き換えています。おそらく10万行程度のコードだと思います。

まずSharpDevelpoでVB2008のプロジェクトをC#プロジェクトに一括変換し(確か、SharpDevelopはVB2010の変換ができない)、VS2010を使ってC#2008のプロジェクトをC#2010にアップグレード、SharpDevelopで変換できなかったVBのコードを少しずつ切り出し、インターネットサイトを利用しC#に変換しました。

機械的な変換処理でやれるところまでやって、VS2010C#でプロジェクトを開くとたくさんのエラーが表示されます。内容は一言でいえば、型指定等VBは緩くC#は厳しいことからくるエラーです。

VBではVariant型という大変便利な型がありましたし、その流れを汲んで暗黙の処理がたくさんあります。基本的にVBにはプログラミングする上で色々横着ができます。

また、モジュールというグローバル変数やメソッドを定義できる仕組みがありますし、メソッドにはオプショナルという引数にデフォルト値を設定できる仕組みがあります。また配列クラス変数に対して、プロパティを定義すればプロパティを使って配列要素にアクセスできますが、C#ではそれができません。

このようにC#は厳密といえば厳密、面倒といえば面倒な言語です。

C#プロジェクトを開くと、プロジェクト全体のエラーではなく、開いたコードに対してのエラーが表示されます。ざっと1ファイル(1000行程度か。Partial Classでは1クラスは数ファイルのことも)100程度のエラーが出てきます。エラーをつぶしていけば、後でみるファイルほどエラーの数は少なくなるでしょうが、どちらにしても相当数のエラーをつぶしさなければいけません。

私は長年VBを書いてきましたので、少し気取っていえば裏技的あるいは高度なVBの技法を取り入れていますので、その分C#への移植は難しくなります。

今は半分機械的にエラーをつぶしていますし、その場で分からないこと面倒なことはコメントアウトしていますので、とりあえずの作業の後に高度にC#を研究しなければいけないかもしれません。

フォームには大抵深刻なエラーがあってデザイン画面を表示することができません。すべての画面はつくりかえた方が早いでしょう。

VB2C#の変換は予想以上に大変な作業ですが、この際勉強だと思えば楽しみ半分です。

このプロジェクトのエラーをすべてつぶしたときには、一端のC#プログラマになっているでしょう。

SQL Server のページング、 Power Shell

Accessプロジェクトのトラブルシューティングはまだ続いています。
この2ヶ月で細かいバグを10個ほど修正し、全面書き換え2本のコードを書いています。
1本はほぼ完成。もう一本も今週中には終わらせたいと思っています。

細かい手直しの部類です。次のようなものがありました。

SQL Serverの結果データをAccessシートで表示するには、レコード数10,000が限界のうようです。

数万レコードをページングして自由に表示するには工夫が必要です。
幸いSQL Server 2008では新たに、共通テーブル式(CTE)ROW_NUMBERが使えます。

CTEの構文は次のようなものです。

WITH <CTEの名前>(<列の名前>)
AS
(
<クエリ>
)
(SELECT * FROM <CTEの名前>)

ROW_NUMBERは<クエリ>の結果に自動で行番号を振ります。
その列名を今RowNumberとして次のような文を作成します(@開始行等は変数名です)。

WITH tmpTable
AS
(
SELECT T.*, ROW_NUMBER() OVER (ORDER BY 商品CD) AS RowNumber FROM [WRK_商品] T
)
SELECT * FROM tmpTable
WHERE RowNumber BETWEEN @開始行 AND (@開始行+@行数-1)

Accessフォームにデータを連結するには、フォームのレコードソース・プロパティにSQLやテーブル名を設定します。
ところが設定する文の長さが128文字(正確ではありません。忘れました)に制限されていて、
どうしても上の文を128文字以下にできません。

次の手はこれを下のように引数付きのストアドプロシージャにすることです。

CREATE PROCEDURE [Sp_商品表示] (
@開始行 integer,
@行数 integer
)
AS
BEGIN
WITH tmpTable
AS
(
SELECT T.*, ROW_NUMBER() OVER (ORDER BY 商品CD) AS RowNumber FROM [WRK_商品] T
)
SELECT * FROM tmpTable
WHERE RowNumber BETWEEN @開始行 AND (@開始行+@行数-1)
END

ところが今度は引数付きのストアドプロシージャをどうやって先のプロパティに設定すればいいのかわかりません。
あちこち情報を探し回りましたが、使っているAccessそのものが古い(2003)し、なかなか思った解決策が見つかりません。
やっと探し当てました。
次のようにストアドプロシージャをExecでコールすればいいのです。
結構早く反応します。

Form_商品表示.RecordSource = “Exec [Sp_商品表示] ” & 開始行 & “,” & 行数

話は変わりますが、私はPerlをよく使います。
DBの結果出力が正しいかどうか。
SQL Serverでは結果セットをCSVに書き出すことができます。
正しい結果のCSVがあるとして、これとテスト結果との突合せにPerlで小さいプログラムを書けば簡単に照合できます。
テキストデータ(ファイル)の検査とか、変更とかこれほど便利なツールはないと、
Perlをとても重宝しています。

また話は変わりますが、今回色々調べていて、Windows Power Shellなるものがあることを知りました。
これまでは、バッチブログラムの実行はコマンドプロンプトWindowを開いて、いくつかのDOSコマンドを敲き、プログラムを起動していました。

このことに不便は感じていなかったのですが、Windows Power Shell(以下PS)があることを知りましたので、どんなものか勉強してみました。
Perlのようなものかと思いましたが、確かにPerlの記法も取り入れていますが、
WindowsでGUIを使って色々操作していたこと(システム管理)が、
大抵このPSで実行可能らしいことがわかりました。
Perlとは違う場所でこれはこれで「使えそうだ」という感想を持っています。

私のコンピュータ

1TBの新しいコンピュータは無事に動作しています。
期待よりうるさい(特に電源を入れた直後)のが唯一不満ですが、
まあとりあえず我慢しましょう。

このコンピュータには最新の環境(Win 7、 VS2010、 SQL Server 2008、 Office 2010、 Expression WEB)を作り、
C#のプロジェクトを書いています。
C#は勉強だけはしたのですが本格的に書いたことがなかったので、
VBで取り掛かったプロジェクトをC#に書き換えています。
まず、SharpDevelopでVBプロジェクトをC#に一括変換し、
SharpDevelopで変換できなかった部分を、
少しずつ切り出してインターネットの変換サイトで変換。
あとはVS2010C#プロジェクトを開いてエラー部分を手作業で書き換えています。
ちょうどいい勉強です。
ちょっとしたことがVBとC#で異なりますので、色々調べまわっています。

参考書は、
以前購入した[プログラミング Visual C# 2005](その他翻訳本3冊)とLINQ本3冊、
今回購入した[Pro C# 2010 and the .NET 4 Platform]、
[Entity Framework 4.0 Recipes]それにJeffrey Richterの[CLR via C#]です。
戦闘準備完了。

さてこれまで私は使っているコンピュータのディスクが一杯になったり、
新たな開発環境を導入しなければいけなくなったとき、
コンピュータを新しくしていました。

今回リムーバブルディスクを付けたコンピュータを組み立てましたので、
コンピュータの使い方を整理したいと思います。

現在私は4台のコンピュータを使っています。
そのうち一台はラップトップですので、これは外で必要な時に使います。
一台は昨年購入したDellでそれなりに満足しています。
本当はこれにリムーバブルディスクをつけようとしてのですが、
ケースのデザイン上それができなくて、今回新しいコンピュータを作った次第です。
いまのところDellは日常のメールや事務的作業と、
このコンピュータで始めたプロジェクトだけに使うことにします。
ですから今後はこのコンピュータにいろいろインストールしないで、
トラブルが起きないようにします。

あと2台はリムーバブルディスクを入れています。
原則1ディスク1開発環境にします。
すなわちOS、VS、データベース、Office等バージョンが異なれば別ディスクにします。
更に大きなプロジェクトは単独ディスクにします。
古いプロジェクトは10年位前に作ったIDEのディスクに入っていますので、
これはこれで整理し、これからのプロジェクトはSATAのディスクに整理していきたいと思います。
その他500Gと200GのUSBディスクがありますので、あらゆる情報はここにコピーし万一の事態に備えます。
Dellと新しいSATAコンピュータはCPU切り替え器を介してキーボード等を共有しています。
IDEコンピュータはスタンドアロンです。

今のところレイドは使っていません。
機会があれば使いたいと思いますが、現在のやり方で特に不自由はないと思っています。