2007年6月21日木曜日

[VB2005] メソッド名を取得する

トレースログなんかで、自メソッドを呼んだのは誰?なんて事を知りたいときが良くあります。
そんなときに使えそうな処理がわかりました。
クラス名とメソッド名が取得されます。

これから、Reflection関係を勉強してみたいです。

---------------------------

Dim st As StackTrace = New StackTrace(False)
Dim sf As StackFrame
Dim mb As System.Reflection.MethodBase

Dim sf0 As StackFrame = st.GetFrame(0)
Dim mb0 As System.Reflection.MethodBase = sf0.GetMethod()

Dim stackLoop As Int32 = 1

Dim className As String = String.Empty
Dim methodName As String = String.Empty
Do

sf = st.GetFrame(stackLoop)
mb = sf.GetMethod()

If (mb.ReflectedType.Name = mb0.ReflectedType.Name) Then
stackLoop += 1
Else
className = mb.ReflectedType.FullName
methodName = mb.Name
Exit Do
End If
'まぁ50も見とけば良いでしょう
If (50 < stackLoop) Then
Exit Do
End If
Loop

2007年6月8日金曜日

[SQL Server 2005] SQL Serverでテーブル定義取得

SQL Server 2005で、テーブル定義らしいものを取得するクエリです。
これを使って、テーブル定義書を自動生成させてます。

select
Col.name as '名称'
,(Select top 1 name From systypes Where systypes.xtype = Col.xtype) as '型'
,Col.length as '桁数'
,case isnull(Col.scale,0)
 when 0 then ' '
 else cast( Col.scale as char(10) )
 end '小数部'
,case  Col.isnullable
 when 0 then '○'
 else ' '
 end 'NN'
,isnull((select case colid when 0 then '' else '○' end  from sysindexkeys as keys where col.id = keys.id  and col.colid = keys.colid and keys.indid = 1),' ') as 'PK'
,isnull((select top 1 ex.value from sys.extended_properties as ex where col.id = ex.major_id and ex.minor_id = col.colid and ex.name = 'MS_Description' ),' ') as 'コメント'
From syscolumns as col
inner join sysobjects as obj on col.id = obj.id
Where obj.name = '<テーブル名>'

2007年4月23日月曜日

[ASP.NET] Validator系の動作

知らなかった。。。

Validator系(RequiredFieldValidator、RegularExpressionValidator、CompareValidator、RangeValidator)はクライアント側のチェックだけではなくて、サーバ側でもチェックを行っていたんですね。

ただし、CustomValidatorはサーバサイドではチェックされないんですね。

たまには本を読むのもよいものですね。

2007年4月13日金曜日

[ASP] ASPからVB2005のDLLを使う

ASP.NetではなくてASPです。
色々調べてたんですけど、勝手にかなりメンドクサイらしいという結論に達してました。
ところが、K君に「こんな感じで出きったぽいんですけど。。」と。

うん。出来てました。

1.VB2005でクラスライブラリを作成する。
2.新しい項目の追加で「COMクラス」を追加する。
3.COMクラスを作りこむ
4.セットアッププロジェクトを追加してインストーラを作る
5.インストールする

なんと、これだけでいけちゃいました。

例えば「ASPComTest01」と言うプロジェクトを作成して、
その中にCOMクラス「ComClassTest01」を追加します。
で、適当に文字列を返すメソッド「TestString」を作ります。
そしてインストール。
ASP側は

Set obj = Server.CreateObjext("ASPComTest01.ComClassTest01")

なんて感じでインスタンスは出来ちゃいます。

はぁ~。

2007年3月28日水曜日

[ASP.NET] Vistaでステップ実行が出来ない時


VistaでASP.NETをデバッグしようとしても、ブレイクポイントで止まらないのです。
ちょっと調べたところ、周知の問題らしいです。
これでまた、「アクセス許可を管理者に昇格」のやり方がわからなくてまいりました。。。

インストール環境によりますが、C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exeを右クリックして、プロパティの特権レベルを設定するようです。

2007年3月16日金曜日

[VB.NET] 配列の指定要素のみを削除する

配列の最後の要素の消すのはなんてことはないのですが、
中盤の要素を削除するのって結構メンドクサイですね。
 
Private Sub ArrayRemove(ByRef TargetArray As String(), ByVal deleteIndex As Integer)

 '一時保管用配列
 Dim newArray As String()
 ReDim newArray(TargetArray.GetUpperBound(0) - 1)

 '一時保管用配列にすべてをコピーする
 Array.Copy(TargetArray, 0, newArray, 0, deleteIndex)

 '一時保管用配列に削除対象の要素以降の値をコピーする
 Array.Copy(TargetArray, deleteIndex + 1, newArray, deleteIndex, TargetArray.GetUpperBound(0) - deleteIndex)

 'オリジナルの配列の格納領域を再割り当て
 ReDim TargetArray(newArray.GetUpperBound(0))

 '値を代入
 TargetArray = newArray

End Sub

2007年3月13日火曜日

[SQL] Order by でNullの行を下に持って行きたい

ある列のソートで値が設定されているものを上位に、
Nullであるものを下位にしたい時にこんなクエリにしたらうまく出来ました。
ちなみに SQL Server 2000です。

-----------------------

select * from Orders
order by
case when ShipRegion is null then 0 else 1 end desc
,ShipRegion Asc

2007年3月7日水曜日

[VISIO] マスタシェープのドロップ時にカスタムプロパティを開く

Visio 2003にてマスタシェープをドロップした際に、カスタムプロパティを開く方法。

1.メニュー -> ツール -> オプション -> 詳細設定タブ
  詳細設定オプションの「開発モードで実行する」をチェック状態にする。
2.図形ウィンドウの対象のステンシルがあるタブを右クリックして、「ステンシルの編集」をクリックする。
3.対象のマスタシェープを右クリックし、マスタシェイプの編集 -> マスタシェイプの編集をクリックする。
4.メニューの図形->カスタムプロパティをクリックして、カスタムプロパティの編集フォームを表示する。
5.そのフォームの中に「ドロップ時に確認」と言うチェックボックスがあるのでチェックする。

これで完了。

シェープをフォームに貼り付けるとカスタムプロパティフォームが勝手に表示されます。

2007年3月2日金曜日

[VB.NET] ビットシフト

今まで実践で使ったことがありません。
と言うか、使い方がわかってないから使えていないだけなんでしょうか。。。
これから意識していきたいです。

Dim i As Integer
i = 2
i = i << style="color: rgb(0, 153, 0);">'10進数数値
Debug.WriteLine("10進数数値:" & Convert.ToInt32(i, 10))
'2進数文字列に変換
Debug.WriteLine("2進数文字列に変換:" & Convert.ToString(i, 2))
'16進数文字列に変換
Debug.WriteLine("16進数文字列に変換:" & Convert.ToString(i, 16))

'10進数数値:4
'2進数文字列に変換:100
'16進数文字列に変換:4

i = 2
i = i << style="color: rgb(0, 153, 0);">'10進数数値
Debug.WriteLine("10進数数値:" & Convert.ToInt32(i, 10))
'2進数文字列に変換
Debug.WriteLine("2進数文字列に変換:" & Convert.ToString(i, 2))
'16進数文字列に変換
Debug.WriteLine("16進数文字列に変換:" & Convert.ToString(i, 16))

'10進数数値:8
'2進数文字列に変換:1000
'16進数文字列に変換:8

i = 2
i = i >> 1
'10進数数値
Debug.WriteLine("10進数数値:" & Convert.ToInt32(i, 10))
'2進数文字列に変換
Debug.WriteLine("2進数文字列に変換:" & Convert.ToString(i, 2))
'16進数文字列に変換
Debug.WriteLine("16進数文字列に変換:" & Convert.ToString(i, 16))

'10進数数値:1
'2進数文字列に変換:1
'16進数文字列に変換:1

i = 2
i = i >> 2
'10進数数値
Debug.WriteLine("10進数数値:" & Convert.ToInt32(i, 10))
'2進数文字列に変換
Debug.WriteLine("2進数文字列に変換:" & Convert.ToString(i, 2))
'16進数文字列に変換
Debug.WriteLine("16進数文字列に変換:" & Convert.ToString(i, 16))

'10進数数値:0
'2進数文字列に変換:0
'16進数文字列に変換:0

2007年2月28日水曜日

[VB.NET] 指定プロセス名をすべて終了させる

指定のプロセス名をすべて終了させてみます。

' 対象プロセス名は"Main"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim p As New System.Diagnostics.Process
  Dim inst As Process
  Dim myProcess() As Process

  myProcess = System.Diagnostics.Process.GetProcessesByName("Main")
  For Each inst In myProcess
    p = System.Diagnostics.Process.GetProcessById(inst.Id)
    p.Kill()
  Next

End Sub

2007年2月15日木曜日

[VB.NET] WMIクラスの自動コード生成

MgmtClassGen.exeを利用してWMIのマネージコードを作成できます。
「C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin」とか「C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin」この辺にいます。

ノートパソコンのバッテリー関係の情報を取得するクラス生成の方法は以下のとおりです。

MgmtclassGen Win32_Battery /P c:\Battery.vb /L VB

オプションは /P <ファイルパス>、/L <言語>、ほかにN、O、M、U、PWがあるらしいです。
詳しくは MgmtClassGen /? で。

後はこのあたりで。

2007年2月13日火曜日

[VB.NET] メールの送信フォームを起動する

MAPIって言うものを使うと、MAPIに関連づいたメールクライアント(Outlook ,Outlook Expressなど)の送信フォームを起動できます。

まず、画面にMAPISessionとMAPIMessagesを貼り付けて。。。

----------------
Me.AxMAPIMessages1.SessionID = Me.AxMAPISession1.SessionID

With Me.AxMAPIMessages1
  'メッセージを作成
  .Compose()
  'あて先
  .RecipDisplayName = "[DisplayName]"
  'メールアドレス
  .RecipAddress = "[mailaddress]"
  'Subject
  .MsgSubject = "サブジェクト"
  '本文
  .MsgNoteText = "本文"

  '添付ファイル(複数)
  For i As Int32 = 0 To filelist.Count - 1
    .AttachmentIndex = i
    .AttachmentPathName = DirectCast(filelist.Item(i), FileInfo).FullName
    .AttachmentName = "Flie" & (i + 1).ToString
    'コレが重要。スペースが必要。
    .MsgNoteText = " "
    'NOTE .MsgNoteText = " " -> KB173853 in microsoft
  Next

  Try
    .Send(True)
  Catch ex As System.Runtime.InteropServices.COMException
    Debug.WriteLine("メール送信時のキャンセルでComExceptionが発生っぽい")
    Debug.WriteLine(ex)
  End Try
End With

Me.AxMAPISession1.SignOff()

2007年2月1日木曜日

[技術メモ] Vista + Visual Studio .Net 2003

結論から言いますと、VistaでVS2003は使えません。
いや、使えるんですけどMSのサポート外らしいです。
http://www.microsoft.com/japan/msdn/vstudio/support/windowsvista/faq/

ほんとメイワクな話です。

2007年1月29日月曜日

[VB.NET] 数値書式指定文字列

数値書式指定文字列について。

Dim i As Integer
i = 1234567890
Debug.WriteLine("C " & i.ToString("C"))
Debug.WriteLine("D " & i.ToString("D"))
Debug.WriteLine("D12 " & i.ToString("D12"))
Debug.WriteLine("E " & i.ToString("E"))
Debug.WriteLine("F " & i.ToString("F"))
Debug.WriteLine("F4 " & i.ToString("F4"))
Debug.WriteLine("G " & i.ToString("G"))
Debug.WriteLine("G4 " & i.ToString("G4"))
Debug.WriteLine("G12 " & i.ToString("G12"))
Debug.WriteLine("N " & i.ToString("N"))
Debug.WriteLine("N0 " & i.ToString("N0"))
Debug.WriteLine("N12 " & i.ToString("N12"))
Debug.WriteLine("12N " & i.ToString("12N"))
Debug.WriteLine("P " & i.ToString("P"))
'Debug.WriteLine("R " & i.ToString("R")) ' 無効
Debug.WriteLine("X " & i.ToString("X"))
Debug.WriteLine("X8 " & i.ToString("X8"))

Dim d As Double
d = 1234567890.0987654
Debug.WriteLine("C " & d.ToString("C"))
'Debug.WriteLine("D " & d.ToString("D")) ' 無効
Debug.WriteLine("E " & d.ToString("E"))
Debug.WriteLine("F " & d.ToString("F"))
Debug.WriteLine("F4 " & d.ToString("F4"))
Debug.WriteLine("F5 " & d.ToString("F5"))
Debug.WriteLine("F6 " & d.ToString("F6"))
Debug.WriteLine("F7 " & d.ToString("F7"))
Debug.WriteLine("G " & d.ToString("G"))
Debug.WriteLine("G12 " & d.ToString("G12"))
Debug.WriteLine("N " & d.ToString("N"))
Debug.WriteLine("N3 " & d.ToString("N3"))
Debug.WriteLine("P " & d.ToString("P"))
Debug.WriteLine("R " & d.ToString("R"))
'Debug.WriteLine("X " & d.ToString("X")) ' 無効

って感じで実行してみると、
C \1,234,567,890
D 1234567890
D12 001234567890
E 1.234568E+009
F 1234567890.00
F4 1234567890.0000
G 1234567890
G4 1.235E+09
G12 1234567890
N 1,234,567,890.00
N0 1,234,567,890
N12 1,234,567,890.000000000000
12N 12N
P 123,456,789,000.00%
X 499602D2
X8 499602D2

C \1,234,567,890
E 1.234568E+009
F 1234567890.10
F4 1234567890.0988
F5 1234567890.09877
F6 1234567890.098770
F7 1234567890.0987700
G 1234567890.09877
G12 1234567890.1
N 1,234,567,890.10
N3 1,234,567,890.099
P 123,456,789,009.88%
R 1234567890.0987654

こんな結果に。お手軽に使えるN0辺りはお勧めかも。

2007年1月27日土曜日

[VB.NET] Select Caseで色々と。

Caseの部分は結構色々書けるんですね。
複数項目の場合(1 or 2 or 4)は
Case 1,2,4
範囲指定の場合(10以上15以下)は
Case 10 To 15
またそのあわせ技
Case 1,2,4, 10 To 15
比較演算子も使えたり(100以上)は
Case Is >= 100

以上から
1か2か4か10から15の間か100以上であるなんて場合は

Select Case selectValue
 Case 1 ,2 ,4 ,10 To 15 ,Is >= 100
  ' 処理
 Case Else
  ' 例外処理
End Select

って書き方が出来るらしいです。
If文よりもすっきりです。

[VB.NET] MAPIを使ってメールの作成

画面にMAPISessionとMAPIMessagesを貼り付けて。。。

-----------------------

Me.AxMAPISession1.SignOn()

'セッションの関連付け
Me.AxMAPIMessages1.SessionID = Me.AxMAPISession1.SessionID

With Me.AxMAPIMessages1
  'メッセージを作成
  .Compose()

  'あて先
  .RecipDisplayName = "[DisplayName]"
  'メールアドレス
  .RecipAddress = "[mailaddress]"

  'Subject
  .MsgSubject = "サブジェクト"
  '本文
  .MsgNoteText = "本文"
  '添付ファイル(複数)
  For i As Int32 = 0 To filelist.Count - 1
    .AttachmentIndex = i
    .AttachmentPathName = DirectCast(filelist.Item(i), FileInfo).FullName
    .AttachmentName = "Flie" & (i + 1).ToString
    'コレが重要。スペースが必要。
    'NOTE .MsgNoteText = " " -> KB173853 in microsoft
    .MsgNoteText = " "
  Next

  Try
    .Send(True)
  Catch ex As System.Runtime.InteropServices.COMException
    Debug.WriteLine("メール送信時のキャンセルでComExceptionが発生っぽい")
    Debug.WriteLine(ex)
  End Try
End With

Me.AxMAPISession1.SignOff()

2007年1月26日金曜日

[VB.NET] 現在のログインユーザが管理者権限かをチェックする

現在のログインユーザが管理者権限かをチェックするには。。。

Imports System.Security.Principal

Private Function IsAdministrator() As Boolean

  ' 現在の Windows ユーザを表す WindowsIndentity オブジェクトを取得
  Dim Identity As WindowsIdentity = indowsIdentity.GetCurrent()
  ' ロールを評価するための WindowsPrincipal オブジェクトを
  ' WindowsIdentity オブジェクトから作成します
  Dim principal As New WindowsPrincipal(Identity)

  If principal.IsInRole(WindowsBuiltInRole.Administrator) Then
    Return True
  Else
    Return False
  End If
End Function

[APS.NET] ASP.NET 1.1が実行されてないエラーの対処

以下のサイトからの引用です。
http://www.masahiko.info/it/archives/000408.html

Visual Studio .NETでASP.NET WebアプリケーションやASP.NET Webサービスのプロジェクトを作成するとき、「指定されたWebサーバーでASP.NET Version 1.1が実行されていません。ASP.NET Webアプリケーションまたはサービスを実行することはできなくなります。」というエラーが発生する時の対処方法。

(1).NET Framework 1.1がインストールされているかチェック。インストールされていなければ、Windows Updateもしくは次のサイトから再配布可能パッケージを入手してインストールします。

(2).NET Framework 1.1がインストールされているにもかかわらず、このエラーが発生する場合は、ASP.NET 1.1を再登録する必要があります。再登録の方法は次の手順で行います。
1.「ファイル名を指定して実行」を起動します(Windowsキー+「R」キー)。
2.表示されるダイアログに「%SYSTEMROOT%\Microsoft.NET\Framework」を入力して実行。
3.表示されるエクスプローラの中からVersion 1.1用のフォルダ「v1.1.????」(例:v1.1.4322)を開きます。
4.「aspnet_regiis.exe」があるのを確認してください。
5.再度「ファイル名を指定して実行」を起動して、「cmd」と入力して実行します。
6.コマンド プロンプトが起動するので、そのウィンドウ内に先ほどの「aspnet_regiis.exe」をドラッグ&ドロップしてください。
7.すると、「aspnet_regiis.exe」のフル パスが自動的に入力されます。
8.フル パス後に1つ半角スペースを空けて「/i」(インストールの意味)と入力して実行します。
9.以上で、ASP.NETへの.NET Framework 1.1のインストールが完了します。

ちなみに、「aspnet_regiis.exe」のオプションで「/u」を入力すると、アンインストールできます。

[ASP.NET] ASP.NETでPDFをStream出力

VB.NET で Webアプリケーションを作成します。
んで、参照設定で「CrystalDecisions.*」を設定。
次にプロジェクトにCrystalレポートファイルを追加します。
ファイル名(=クラス名)MDA20で保存します。

フォームにボタンを追加してクリックイベントに以下のコードを書くと
サーバ上にpdfファイルを作成せずにクライアントにダウンロードさせることが出来まっす。

あ、imports はテキトウに設定をしないとだめだす。

--------------------------

Dim Report As New ReportDocument
Dim exportOpts As New ExportOptions
Dim b As Byte()
Dim st As System.IO.Stream

'レポートをロード
Report = New Report20

'以下エクスポート処理
exportOpts = Report.ExportOptions

'PDFを指定
exportOpts.ExportFormatType = ExportFormatType.PortableDocFormat

'
' PDFのオプション設定
'
Dim pdfOption As New PdfRtfWordFormatOptions
' ページ指定
pdfOption.FirstPageNumber = 1
exportOpts.FormatOptions = pdfOption

' ↓なぞ
Dim req As ExportRequestContext = New ExportRequestContext
req.ExportInfo = exportOpts

'出力先はStream
st = Report.FormatEngine.ExportToStream(req)

ReDim b(st.Length)
' データをバイト列に変換
st.Read(b, 0, Convert.ToInt32(st.Length))

' ブラウザに出力する場合はこれ
'Response.ContentType = "Application/pdf"
'Response.BinaryWrite(b)
'Response.End()

' 保存ダイアログを表示する場合はこっち
With HttpContext.Current.Response
.ContentType = "application/pdf"
' 日本語はだめっぽい
.AppendHeader("content-disposition", "attachment; filename=Report20.pdf")
.BinaryWrite(b)
.End()
End With