- めだか
- 大ベテラン
- 会議室デビュー日: 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
こみゅぷらす
|