SSブログ

Excel 2003 では CAG に .NET Assembly が入るらしい [DotNET]

(常山日記経由)
IronPython で操る例
http://d.hatena.ne.jp/fits/20070806/1186379049
いつか使うかもなので、メモっておく。


C# から IronPython へ オブジェクト変数を渡す [DotNET]

C# なんかで作った DLL のオブジェクトを IronPython から作って呼ぶのは簡単。
でも、確か 1.1 までは C# から IronPython で書いたコードを呼ぶ、というか C# で作ったオブジェクトを IronPython に渡して処理してもらうのは(どっかでチラッと見たけど)あんまりうまくできなかったような・・・。

IronPython 2.0 になると、ここ↓の下の方で、Testクラスのオブジェクト obj を渡してるように、
http://journal.mycom.co.jp/articles/2007/07/03/IronPython2/004.html
C# から IronPython を呼ぶ、というか C# で作ったオブジェクトを渡して IronPython で処理してもらうのが簡単になったような。少なくとも、直感的になった。
これなら、.NET アプリケーションに簡単に IronPython のエンジンを組み込んで、
内部マクロ言語みたいにして使えそう。


SQL文の Syntax Highlighter が欲しい [DotNET]

常山日記経由
あなたのソースコードを彩る、Syntax Highlighterまとめ
http://blog.37to.net/2007/06/syntax_highlighter/
を見てふと思った。

Rich Text で SQL文の Syntax hilight したい

構文をパースしなくても、正規表現で予約語にマッチしたのだけ色を変えてあげればいいと思うんだけど、それじゃだめなパターンもあるのかなぁ。
全文でチェックすると大変なことになっちゃう気がする。
行単位でチェックすれば良いと思うけどだめかなぁ。

とりあえず、思ったところの色とかを変える方法↓を発見。
指定した文字を検索してハイライト表示する方法
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/Search/

ちなみに、CPython には SilverCity っつーのがあるらしいです。


IronPython with Visual Studio 2005 の進捗 [DotNET]

Visual Studio のライセンス持ってないので眼中に無いが・・・
http://saekiyoshiyasu.org/pyb/pyblosxom.cgi/programming/python/ironpythonwithvisualstudio2005-2007-06-27-13-55.html
既に、フォームデザインとコード生成ができるとこまで来てるらしい。
すげぇ、さすがマイクロソフト。
#ふにゃるんさんの記事は前に見た記憶があるけど、真剣に読んでなかったみたい

機械出力すると(特に VS では)コードが冗長になるので使いたくないが。
#作るのは速いけど直すとこまで考えると結局全部手で書いたほうが効率良いような
#昔、リソースエディタで出力した rc ファイルを vi で編集した記憶が・・・
今後 Visual Python なんて出てくると
「えー、フォームのデザインを手で書いてるんですかぁ、信じられない。VS 使ってください」
と言われそう。
#そんでもって、「1フォーム=1ファイル=1クラス」にして、とか言われそう。うざい。

でもまぁ、今の状態で IronPython を使ってても「きわもの」扱いされるだけなので、Visual Python(仮称) が早く出て VB のように市民権が得られるといいなぁ。


IronPython で、ちまちま SQL Server のデーターベースコピー [DotNET]

ここ↓で、SQL Server 2005→ 2000 のデータ移行に失敗し、
http://blog.so-net.ne.jp/nakagami/2007-05-30-1
救世主を求めていただけど、誰もやってきてくれない。

仕方がないので、IronPython で自前プログラムでやることにした。
ここ↓のアーカイブから sqlutil.py だけ取って来て
http://blog.so-net.ne.jp/nakagami/2007-06-02

こんな感じ

import sqlutil
sqlutil.copy_db('src_server', 'user_a', 'user_a pass', 'src_dbname',
        'dest_server', 'user_b', 'user_b pass', 'dest_dbname', debug = True)

最低限必要な
・テーブルレイアウト
・主キー、外部キー
・データ
をコピーするけど、インデックスとかストアドプロシージャとかコピーしてないので、テーブル構造などは、事前にスクリプトを生成→転送先で実行したほうが良い。データコピーは単純に転送元で SELECT して 転送先で INSERT しているので、トリガーなどあるといろいろ不都合あると思う。そもそも遅いし。
でもまぁ僕の要望を満たすことはできた。今のところ文句は言われてない。
いろいろ難はあるけど、この情報が役に立つ人がいるかもしれないので、ここに記しておく。


IronPython でバイナリファイルを保存(と読み込み) [DotNET]

from System.IO import *
fs = FileStream('foo.pdf', FileMode.Create)
bw = BinaryWriter(fs)
bw.Write(pdf_image_body)
bw.Close()
fs.Close()

FileStream と BinaryWriter に分かれてるところがミソですな。

そういえば、以前 IsolatedStorageFileStream にテキスト形式(StreamReader/StreamWriter)で読み書きした
http://blog.so-net.ne.jp/nakagami/2006-11-22
http://blog.so-net.ne.jp/nakagami/2006-11-22-1

・・・というわけで、FileMode.Read で FileStreamオブジェクトを生成して BinaryReader で Read() すれば、バイナリファイルの読み込みもできそう。

(追記)よく考えたら、普通に Pythonic にやればいいんだ

f = open('foo.pdf', 'wb')
f.write(pdf_image_body)
f.close()

IronPython で MDB ファイルにアクセス [DotNET]

OleDB Provider を使って、MDB ファイルにアクセスしてみた。

基本的に SQLServer ↓と同じような感じ
http://blog.so-net.ne.jp/nakagami/2006-11-08
API を SqlXXXXX → OleDbXXXX に読み替えれば良い。

Firebird .NET Provider ならこんな感じ
http://blog.so-net.ne.jp/nakagami/2006-04-09
API を FbXXXXX → OleDbXXXX に読み替えれば良い。

clr.AddReference("System.Data")
from System.Data.OleDb import *
conn = OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=foo.mdb")
conn.Open()

dr = OleDbCommand("select * from bar")
for r in dr:
    print r['COL_A'], r['COL_B'], r['COL_C']

sql = "insert into FOO (COL_B, COL_C) values (@B, @C)"
cmd = OleDbCommand(sql, conn)
cmd.Parameters.Add(OleDbParameter('@B', 'Bob'))
cmd.Parameters.Add(OleDbParameter('@C', 12345))
cmd.ExecuteNonQuery()
auto_number_id = OleDbCommand("select @@IDENTITY", conn).ExecuteScalar()
print auto_number_id

conn.Close()

insert した直後に select @@IDENTITY すると、オートナンバーの値が取ってこれる。
Note というフィールドを作って、そこに INSERT しようとしてエラーになってはまった。Access 的には、Note というフィールドを作ることはできるけど、SQL エンジン的にはダメみたい。


IronPython 1.1 がリリースされた [DotNET]

http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=2573

どこらへんが変わったか日本語で知りたい場合は、↓ここらを参照(かな)。
http://foma-zakki.cocolog-nifty.com/zakki/2007/04/python_ironpyth_065d.html

使ってる CLR が変わるわけじゃないので、僕の場合は 1.0 でも 1.1 でも大差ない。
少なくとも、これ↓は、まったく変わりなく動いてる。
http://blog.so-net.ne.jp/nakagami/2007-04-14

今のところ、1.1じゃないと困るって場面は殆どないんじゃないかな。


DataAdapter に挫折 ColumnChanging イベントを使うことにする [DotNET]

http://blog.so-net.ne.jp/nakagami/2007-04-05 の続き。

次の機能として、 Firebird のデータをツール上で編集したくなった。

以前調べた、ここらへん↓を基点に試行錯誤してみる
http://blog.so-net.ne.jp/nakagami/2007-03-24-1
DataGridView と DataTable を FbDataAdapter でつないで、FbDataAdapter に
・InsertCommand
・UpdateCommand
・DeleteCommand
プロパティを設定して、FbDataAdapter.Update() でデータ更新というのが、一番美しいかなぁ・・・と思う。
概念的なところは、ここ↓が分かり易いかな。
http://www.atmarkit.co.jp/fdotnet/vblab/vsdbprog_02/vsdbprog_02_01.html

・・・が、いろいろやってみた結果、挫折。どうもよくわからない。
概念的な理解の次に、じゃ具体的にどう書けば良いか?というところまでくると、はっきり書いてあるサンプルが発見できない。
#SQLServer でウィザードを使う場合は便利なのかもしれないが・・・
#おもちゃ程度なら良いが、うまくスケールしないような気もするし・・・
結論として、DataAdapter.Update() でデータの更新をするのはやめることにした。
なんとなく、今後も使わないほうが良いような気がする。

とにかく、次に、別の方法について調べることにした。
Insert Delete は、ごまかすとして、 Update はセルを編集したら更新できるようにしたい。

セルのデータが変更されたのを検知して Update 処理をするにはどうするのがいいかなぁ・・・
DataTable クラスの ColumnChanging イベントハンドラでやるのが良さそう。
http://www.atmarkit.co.jp/fdotnet/dotnettips/099dgchgcell/dgchgcell.html
うーむ、DataTable 側で変更を検知するとは思わなかったよ。
上記の例を参考に、とりあえず今回やりたいことはできそう。


ADO.NET について [DotNET]

DataGridView についても良くわからないが・・・
http://blog.so-net.ne.jp/nakagami/2007-02-27
結局のところ、ADO.NET がどんなものかってのが良く分かってないらしい。
後で読む候補を探してみる。

ADO.NET 雑談スレ
http://pc11.2ch.net/test/read.cgi/db/1104630889

データベースのレコードを更新する
http://msdn2.microsoft.com/ja-jp/library/ms233819(VS.80).aspx
TableAdapter を使用してデータを更新する
http://msdn2.microsoft.com/ja-jp/library/ms171933(VS.80).aspx
TableAdapter
http://msdn2.microsoft.com/ja-jp/library/7zt3ycf2(VS.80).aspx
ADO.NET でのデータの更新
http://msdn2.microsoft.com/ja-jp/library/ms254950(VS.80).aspx

自分の日記
http://blog.so-net.ne.jp/nakagami/2007-01-17

(追記)
DataAdapter によるデータソースの更新
http://msdn2.microsoft.com/ja-jp/library/33y2221y(VS.80).aspx
DataTable を Update() メソッドに渡すと全行に対して行状態チェック→コマンド実行
DataRow を Update() メソッドに渡すと該当行の行状態チェック→コマンド実行
DataAdapter に InsertCommand, UpdateCommand, SelectCommand どんなプロパティを設定すればいいのか?→要検討

データーセットとデータテーブル
http://www.atmarkit.co.jp/fdotnet/vblab/vsdbprog_02/vsdbprog_02_01.html
ADO.NET 基礎講座
http://www.atmarkit.co.jp/fdotnet/basics/adonet_index/index.html

(以下、さらに自分だけのメモ・・・)
SQLServer のテーブル名一覧の取得
select name from [サーバ名].[データベース名].dbo.sysobjects where tyep = 'U' order by name