2007年05月09日

冗談でcontinueを入れたなら

今までのFor文

 for i = 1 to 20
   if i < 20 then goto next_index
   msgbox i & "だよん"
next_index:
 next

いつものようにプログラミングしていて、「あー、めんどいよなー、なんだかもうC++ライクにウザくて面倒なオブジェクト指向っぽいみたいなわけわからんロジックになったんだから、continueぐらい使えろっての」

とcontinueを入力したら

 for i = 1 to 20
   if i < 20 then continue for
   msgbox i & "だよん"
next_index:
 next

になりやがりました。なので

 for i = 1 to 20
   if i < 20 then continue for
   msgbox i & "だよん"
 next

で今後はいけるらしいです。

だから何だと言われればそれまでなんですけどね、今までホントに無かったんだってば、continueがさぁっ!

2007年04月27日

CLRからローカルXMLファイルを読んでみる

CLR→言語は古い?が使い方が新しいらしいプログラム(笑)今回は専門用語とハジケタお話の羅列(笑)

簡単じゃーん、と思っていた。何しろ、CLRときたらほとんど.NETでどう見てもVBです、有難うございました、みたいなくらいに慣れてくると楽ちん言語だったんで……。まさかそんな落とし穴があるとわ(苦笑)

実は、.NETというか、.NET FRAMEWORKと呼ばれる一連のシリーズ、どう言っていいのか判らないのだけれども、まぁ、なんだ、「悪さするプログラマもいるしさー、せきゅりてーせきゅりてーって世間もうるさいしさー、とりあえず、のっけとく?ってカンジィ?」みたく、とにかく、プログラムが悪さしない安全に動作するために、「あんたはここまでしかしちゃいけません」的なパッケージが存在していて、今ではそんな世知辛い制限の中で作ったプログラムを動かす、なんていうのが流行りらしいんです。ばしばしにINT13とかアセンブリレベルでアドレス吐いてコードすっ飛ばしてたのが嘘みたいだ(遠い目)

CLRなんてそれらの最先端らしく、「あれするな」「これするな」がお約束のように存在していて「今からぁ~そいっつぅをぉなっぐりにぃいこぅおかぁ~」とYaaYaaYaaな気分で色々とセキュリティはずししないといけないんですね(汗)

プログラムが実際に動くPC上で

.NET.FRAMEWORKのマイコンピューター>ALL-CODEをFullTrust
 ったりめーじゃん、悪さ実行するためなんだからさぁ、悪いようにしないからさぁ、なんて言いながらセット

CLRストアドプロシジャのアセンブリをセットするデータベースに対してMasterデータベースから

ALTER DATABASE hoge SET TRUSTWORTHY ON;
go

実行したら、使用データベースに移動して、

GRANT EXTERNAL ACCESS ASSEMBLY TO [BUILTIN\Administrators];
go

「良いではないか」「良いではないか」といいつつ、これで、外部との接触OK。CLRプログラム実行PC上のローカルドライブにあるXMLファイルを読めるようになります。もちろん、テキストなんかもね。

ただし、これをやるのは良心回路が正常に働いている時がお勧めです。
やり方によっては……ごほごほ

2007年04月25日

XMLファイルを読んでみる

今回はXMLファイルの読み込み。こいつも.NETで本格的に搭載された新機能ですね。それにしてもVB4から.NETにいきなり飛ぶとこんなにも違うもんなのか……年寄りにはつらいぜ、ふぅ。
かくいうXMLって便利なのか不便なのか良くわかんないんだけれど、以前はiniファイル使ってゴチャゴチャできたことが「iniファイルなんか使ってんじゃねーよ、古いんだよ、これからはXMLの時代だぜぃっ!」なのだそうで……別にiniファイルでも十分だっていうのにXMLに置き換えなくちゃいけないんだよなぁ……

で、まずは、hoge.xml を作成。

<hogehoge>
 <hoge1>
  <hoge1-1>ほげ</hoge1-1>
  <hoge1-2>ホゲ</hoge1-2>
 </hoge1>
</hogehoge>

で、こいつの、<hoge1>~</hoge1>の内容をハッシュテーブルに保存。ハッシュテーブルっていうのは、VB6からいじれるようになったコレクションオブジェクトと同じもの(だと思う)使い方は、キー名をつけてアイテムを保持、ってやつだから、VB6でコレクションオブジェクトを使い慣れている人にしてみれば「ああ、あれね」で終わる話なんじゃないかと。ちなみに、EXCEL-VBAで、range("セル名").value でセルの中身が取れるのも、いうなればこのコレクションオブジェクト、.NETでいうハッシュテーブルと同じ考え方で出来ている代物だったり。

    Dim DATA As Hashtable = New Hashtable
    Dim _xmlFile As XmlDataDocument = New XmlDataDocument
    _xmlFile.Load(xmlPath & "hoge.xml")

    'XMLファイルの検索
    _xmlItems = _xmlFile.SelectNodes("/hogehoge/hoge1")

    '検索結果から格納
    For Each _xmlItem As XmlNode In _xmlItems.ItemOf(0).ChildNodes
     DATA.Add(_xmlItem.Name, _xmlItem.InnerText)
    Next

とりあえず、これでできた(笑)もっとスマートな方法があるのかもしれない、つか、あると思うけど、今の所はこれが限界だぁ(おい)

2007年04月23日

プロパティを使ってみる

VB4.0主流でやってきた人間にとって、「クラス」もさることながら、「プロパティを作る」という概念がそもそもつらい(笑)べつに

Public Class HogeClass
    Public Hoge as string
End HogeClass

とだけ宣言して、HogeClass.Hoge として使っても良いじゃねーの?なんて思うわけ。でもね、こうしちゃうと、ほんとに丸見えなわけですよ。

たとえば、

Private Sub HogePlus
    Hoge = "ABC"
End Sub

としていたら、HogeはいつのまにかABC、実はこのABCにするのはHogeクラスの中だけでいいのかもしんないのに、何から何まで丸見えでなんだか恥ずかしい(笑)

そこで

Public Class HogeClass
    Private _Hoge as string

    Public Property Hoge() As String
        Get
            Return _Hoge
        End Get
        Set(ByVal value As String)
            _Hoge = value
        End Set
    End Property

    Private Sub HogePlus
        _Hoge = "ABC"
    End Sub

End HogeClass

とすると、HogeClassを使いたいプログラムからは、プロパティHogeだけしかみえてないので、中で_HogeがABCになっていたとしても値は変わらず、しかもHogeClassは中で何をしていても「見・ち・ゃ・だ・め♪」とできる

つまり、クラスって固まりは、「何をこうします!」とみんなに宣言しても、中で何やってるかは内緒にしとけ、ってこと。手品の種明かしはするなってことですね

2007年04月17日

もうちょっと詳しくVisualStadio2005ソリューションの話

まず作るのはソリューション一個

で、できたソリューションにSQLServerプロジェクトを追加して、SQLProjectの中にストアドプロシジャ項目を追加、こんな処理を書いてみる。

    <Microsoft.SqlServer.Server.SqlProcedure()> _
    Public Shared Sub TEST_HOGE()
       Dim SQL As SqlCommand
        Dim vValue As long
        Using connection As New SqlConnection("context connection=true")
         connection.Open()
         Try
            SQL = Connection.CreateCommand
            SQL.CommandText = "select VALUE from HOGE"
            SQL.CommandType = CommandType.Text
            Using Rec As SqlDataReader = SQL.ExecuteReader()
                Do Until (Not (Rec.Read()))
                    vValue = CLng(Rec(0).ToString)
                    'vValueのいろいろ処理をいれてみる
                Loop
            End Using
         Catch ex As Exception
          SqlContext.Pipe.Send(ex.Message)
         End Try
        connection.Close()
        End Using
    End Sub

書いたら、早速「ビルド」→「配置」を実行。これでストアドプロシジャ準備完了

これができたら、今度はソリューションにWEBプロジェクトを追加して、データセット項目を追加、データセットの画面で「Query」を追加して、「ストアドプロシジャ」を選択、さっき配置したデータベースにストアドプロシジャ「TEST_HOGE」が見つかるのでそれを選択しておく。これで、データセットオブジェクトにTEST_HOGEというメソッドが完成

VBプロジェクトを追加して、このデータセットオブジェクトを参照すればストアドプロシジャがメソッドとして動きます。もちろん、WEBプロジェクトからもメソッド利用できるよん。

まーよーするに、部品作って関数はメソッド化しとけば間違いないってカンジ(おい)