- PR -

変数を文字列で宣言?

1
投稿者投稿内容
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2006-03-30 09:30
VB2003です

Dim sql01 As String = "insert into m0100 ( cd1,aaa ) values (@99,upper(@01) ) "
Dim sql02 As String = "insert into m0010 ( cd1,bbb ) values (@99,upper(@01)) "
Dim sql03 As String = "insert into m0020 ( cd1,ccc ) values (@99,@01) "

Select Case cbokbn.Text.Substring(0, 2)
Case "01"
kiyocmd.CommandText = sql01
Case "02"
kiyocmd.CommandText = sql02
Case "03"
kiyocmd.CommandText = sql03
end case

上記のようなコードで cbokbn.text の 01〜XX と 変数宣言の sql01〜XX が一致
している場合。
変数の宣言に変数を使ってもっとコード短くしたいのですが可能でしょうか?
dim a1 as string = sql & cbokbn.Text.Substring(0, 2)
kiyocmd.CommandText = a1

以前同じような質問をみたような気がするのですが検索がへたなのかひっかかりませんでした。

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-03-30 09:42
Hashtable でも使ったら短くなりそうですね。テーブルに追加するためコードは必要ですが。
リフレクションを使って無理やりってのもできなくもなさそうですけど、余計に長くなるかな。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-30 09:53
引用:

めだかさんの書き込み (2006-03-30 09:30) より:

end case


End Case なんてものはないですよ。(^-^)

引用:

上記のようなコードで cbokbn.text の 01〜XX と 変数宣言の sql01〜XX が一致
している場合。
変数の宣言に変数を使ってもっとコード短くしたいのですが可能でしょうか?


Select Case 〜 End Select に関してならば、簡素化できるでしょう。

使用場所で展開すれば、当たり前ですが冗長になります。
結局こういうものは管理している場所 (HashTable とか) を別で作れば何ら問題なかったりします。
(まあ、ただ簡素化すれば良いなんてのは古い考えなので注意が必要ですが)

今回の例だと、ストアド プロシージャ側で引数による振り分けをした方が良いのではとも思いますが、
あくまで例だと思って回答しています。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2006-03-30 10:19
>End Case
サンプル加工するときに間違ってしまいました

とりあえず今回はHashtableを使用する事にしました。
select,insert,update,deleteと別ブロックで同じような振り分けしてるのですが
中身は微妙に違うのでストアドに全部いれるのはむずかしそうなので断念しました。
ありがとうございました。
reflectionを使う方法というのがよくわからないのですが、変数の名前を指定して
代入する方法ってのがあるのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-30 10:57
引用:

めだかさんの書き込み (2006-03-30 10:19) より:

reflectionを使う方法というのがよくわからないのですが、
変数の名前を指定して代入する方法ってのがあるのでしょうか?


あるんですが、リフレクションは極力使わないことをお勧めします。
今回は HashTable で事足りますので、使う必要もないですし。

とはいえ、一応例を書いておきますね。
こういう単純なデータクラスがあるとします。

コード:

    Public Class WankumaMember
        Private Const NakaHirotoshi As String = "中博俊"
        Private Const JeanneNet     As String = "じゃんぬねっと"
        Private Const Jitta         As String = "Jitta"
        Private Const Trapemiya     As String = "trapemiya"
        Private Const Yaneurao      As String = "やねうらお"
        Private Const Episteme      As String = "επιστημη"
        Private Const Shuujin       As String = "囚人"
        Private Const Kaya          As String = "夏椰"
        Private Const Naoko         As String = "なおこ(・∀・)"
        Private Const Mayurin       As String = "まゆりん"
        Private Const Moo           As String = "Moo"
        Private Const Maint         As String = "maint"
    End Class


リフレクションを使って、この定数メンバを「メンバ名」で呼び出すためのメソッドを書きます。
(とりあえず、Private メンバでも呼び出せるようにしてあります)

コード:

    Public Shared Function InvokeWankumaMember(ByVal memberName As String) As String
        Dim hType As System.Type = GetType(WankumaItem)

        If hType Is Nothing Then
            Return Nothing
        End If

        Dim wankumaObject As Object = hType.InvokeMember ( _
            memberName, _
            System.Reflection.BindingFlags.NonPublic Or _
            System.Reflection.BindingFlags.Instance  Or _
            System.Reflection.BindingFlags.Static    Or _
            System.Reflection.BindingFlags.GetField,    _
            Nothing, _
            Nothing, _
            Nothing  _
        )

        If Not wankumaObject Is Nothing Then
            Return wankumaObject.ToString()
        End If
    End Function


このメソッドを使って実際に "メンバ名で" 呼び出してみましょう。

コード:

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim stMemberName As String = InvokeWankumaMember("JeanneNet")

        If stMemberName Is Nothing Then
            MessageBox.Show("取得できませんでした")
            Return
        End If

        MessageBox.Show(stMemberName)
    End Sub


この例だと JeanneNet という名前のメンバの中身「じゃんぬねっと」が出力されます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2006-03-30 10:58
質問への直接の回答ではないですが、

例示されているコードがすべてと仮定して、
コード:

Dim sql01 As String = "insert into m0100 ( cd1,aaa ) values (@99,upper(@01) ) "
Dim sql02 As String = "insert into m0010 ( cd1,bbb ) values (@99,upper(@01)) "
Dim sql03 As String = "insert into m0020 ( cd1,ccc ) values (@99,@01) "



コード:

Select Case cbokbn.Text.Substring(0, 2)
Case "01"
kiyocmd.CommandText = sql01
Case "02"
kiyocmd.CommandText = sql02
Case "03"
kiyocmd.CommandText = sql03
end case


が同じメソッドにあるならば、

コード:

Select Case cbokbn.Text.Substring(0, 2)
Case "01"
kiyocmd.CommandText = "insert into m0100 ( cd1,aaa ) values (@99,upper(@01) ) "
Case "02"
kiyocmd.CommandText = "insert into m0010 ( cd1,bbb ) values (@99,upper(@01)) "
Case "03"
kiyocmd.CommandText = "insert into m0020 ( cd1,ccc ) values (@99,@01) "
...


ではだめですか?
わざわざいったん変数にいれる必要はないのではないかと思いました。
このコードブロックを分離して、SQLを保持するメソッドにするという手もあります。


_________________
たつごろー http://www.codeseek.net

[ メッセージ編集済み 編集者: たつごろー 編集日時 2006-03-30 11:05 ]
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2006-03-30 11:10
ありがとうございます
reflectionは使いどころによってはかなり便利そうですね
多用するとメンテしずらいコードになりそうですが。

>たつごろーさん
ブロックが1箇所だけならそれで問題ないのですが
update,insert,deleteブロックでも同じようなことをやってまして
それぞれ入れるSQL文が違うのでhashtableでまとめました。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2006-03-30 11:41
引用:

>たつごろーさん
ブロックが1箇所だけならそれで問題ないのですが
update,insert,deleteブロックでも同じようなことをやってまして
それぞれ入れるSQL文が違うのでhashtableでまとめました。


私の書き込みはめだかさんの質問に対する直接の答えではないので深入りをさけることとします。

ただ、私の意図と違う解釈の書き込みのように読める部分もありましたので、それだけは補足させてください。
私が書いたのは、コード上に準備した値をわざわざいったん実行時のメモリに入れる必要はないのではないか、という意味です。

_________________
たつごろー
codeseek
こみゅぷらす
1

スキルアップ/キャリアアップ(JOB@IT)