カテゴリー: VB.NET

  • VBは、.NET5でもサポートされるけど、新機能はなし。

    前々から、VB(Visual Basic)は終息傾向にあったのはわかっていたけれど、今回、明確に「.NET 5」への対応と、VBでの新規機能の開発はやらないという発表された。過去との互換性重視になるのとのこと。なので、新機能の追加はなく、ゆっくりとした終息になっていく。長く使えたんじゃないだろうか。あとは、OfficeのVBSがどうなるのか。Office上でもJavaScripts(Office Scriptsという)が使えるようになるので、VBSからOffice Scriptsへ移行が促されていくのだろう。

    https://devblogs.microsoft.com/vbteam/visual-basic-support-planned-for-net-5-0/

  • IISが動作しているサーバでは、WinRMのバージョンと構成に注意

    IISを使用しているWindows Server 2008で、WinRMを使用したリモート実行を試みたところ、少なからず問題が発生した。

     

    ■WinRMは、ファイアウォールサービスが起動していないと構成できない。

    Windowsファイアウォールのポリシーを無効化してファイアウォールを 使用しないのは
    問題ないが、サービスは起動しておく必要がある。
    “winrm quickconfig” を実行してエラーになる場合は、ファイアウォールを確認する。
    (サービスが止められているなんて、ある意味想定外だ)

    ■WinRMは、バージョンによって使用するポートが異なる。

    WinRM 1.1(Windows Server 2003 R2, Windows Server 2008)は、
    デフォルトのポートがポート80であり、IISを使用している場合にはポートがかぶる。
    WinRMのサービスでは、IISと競合が可能とのことで、プレフィックス /wsman が
    予約されているとのこと。
    IISで/wsmanを使用していなければ、プレフィックスを付けてアクセスすることで共存はできる。
    アクセスする際に工夫が必要。

    WinRM2.0(Windows Server 2008 R2 以降)は、デフォルトポートが5985番なので、
    IISとポートで競合することはない。
    WinRMのポートを変更することはできるが変更すると、管理サーバと通信できなくなる。

    Windows Server 2008よりも前のバージョンでWinRM(バージョン1.1)を
    使用するときは、 IISとの共存には注意が必要。

    ■参考

    https://msdn.microsoft.com/en-us/library/aa384372%28VS.85%29.aspx

  • IE11

    Windows 7 用にInternet Explorer 11が公開されたので使ってみた。
    使い込んだわけではないので、ファーストインプレッションだが・・・。

    IE11のほうが、IE10よりも動作が早い。
    CSSなのかJSなのか微妙なところではあるが、
    IE9からIE10に上げた時に崩れていたレイアウトがIE11では崩れなかった。
    これは、IE9のようになったということだろうか。

    それから、ちゃんと使い方を調べなければならないと思っているものの
    F12キーを押した時に現れる開発用ツールが便利。
    読み込み速度などもとれるので、ウェブ開発のときのデバックに便利そう。
    IEのモードのエミュレーションにWindows PhoneやSafariなどが入っていて面白そう。
    逆にIEのバージョンを選んだり設定したりするのは、ちょっとめんどくさくなったかも。

    あとは・・・Gmailを開くと、IE10モードになっていて、
    読み込みが最後のほうで止まるのか気になる。
    いろいろと設定を弄くったので、それが原因なのかもしれないけど。

    いろいろと検証しないといけないことが増えたけれど、動作には満足。
    結構、使いやすいんじゃないかと思っている。

  • VB.NET Grid Viewで並び替えを行ったとき、急にエラーが発生するようになったときの対処

    Grid Viewで並び替えを行ったときに、急にエラーが発生するようになったときは、
    Grid Viewで一度に表示させる行が1,000を超えていないか確認する。
    標準の設定では、Grid Viewで一度に扱える値は1,000まで。
    1,000を超えたときに並び変え等を行うと、値を扱えずにエラーが発生してしまう。
    なお、ページ設定を行い、一度に表示させる件数を制限(1,000以下)している場合は、
    この問題は発生しない。

    この問題が発生したときは、Web.configで一度に扱える数を変更することで、対応できる。
    ただし、リソースの問題はあるので、一度に扱う数を押さえるほうが望ましいだろう。

    ■出力されたエラーメッセージ

    2013-02-19 10:36:43,881 ERROR :  - Global_asax.Application_Error[38] :
       場所 System.Web.HttpRequest.FillInFormCollection()
       場所 System.Web.HttpRequest.get_Form()
       場所 System.Web.HttpRequest.get_HasForm()
       場所 System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
       場所 System.Web.UI.Page.DeterminePostBackMode()
       場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    

    ■原因

    ASP.NETのGrid Viewで(実際には、Grid Viewだけではなく、フォームキーなども)扱う行数がデフォルト 1000 になっている。
    そのため、1000 を超えた行数のデータに対して、並び替え等を行うと、値を扱うことができず、エラーが発生する。

    ■対処

    Web.config の appSettings に下記の行を追加し、行(項目)の数を指定する。
    当然、行数(項目数)を増やせば、それだけリソースを消費するので、
    大規模システムや動作の重いシステムの場合には注意が必要。
    行数を増やすのではなく、一度に表示させる件数を絞り込むなどの対応をするほうが堅実的だろう。

     <add key="aspnet:MaxHttpCollectionKeys" value="行(項目)の数" />

    設定例: 行数を2000行にする

       <appSettings>
         <add key="aspnet:MaxHttpCollectionKeys" value="2000" />
       </appSettings>

    なお、この方法で対応できるのは、ASP.NET の2以降。
    1.1系の場合は、別の方法になるので注意すること。

    ■参考URL

    多くのフォーム キー、ファイル、または JSON ペイロード メンバーを含む ASP.NET 要求が例外が発生して失敗する
    http://support.microsoft.com/kb/2661403/ja

  • メモ/ASP.NETから、ExcelファイルをPDFにする方法の調査

    ASP.NETから、Excel2010のPDF化機能を呼び出すことで、
    ExcelファイルのPDF化はできそうである。

    ただし、実行するサーバにExcel2010(Office2010)をインストールする必要あり。
    また、開発環境に該当するライブラリを読み込ませる必要もありそう。

    わかったことは、特定のセルに値を入れたり、
    Excelの内容をそのままPDF化することはできそうだ。
    今のところわからないのは、Excelの特定の場所に画像の挿入ができるかどうかということ。
    透過の話はあるが、できそうな気配はある。

    あと調べなくていけないのは、PDFのセキュリティ設定を行うことができるかどうか。

    ■参考URL

    VB.NET ExcelファイルからPDF出力
    http://tukaenai-pg.cocolog-nifty.com/blog/2012/05/vbnet-excelpdf-.html
    →これが本命。だけど、XLS形式なので、XLSX形式でやりたいところ。

    C#でExcelファイルをPDFに変換する
    http://d.hatena.ne.jp/JHashimoto/20120220/1329736026
    →C#でやる方法。C#でできるなら、VBでも可能なはず。

    ExcelファイルからPDFファイルやXPSファイルを作成する
    http://blog.powershell-from.jp/?p=965
    →これはPowerShell?を使用した方法。

    VB エクセル操作
    http://www.red.oit-net.jp/tatsuya/vb/Excel.htm

  • ASP.NET(VB) 西暦を和暦に変換する

    正月だからというわけではないのだが、VBで西暦を和暦に変換する方法のメモ。

    JapaneseCalendarを使用することで、西暦を和暦に変換することができる。
    元号は、フォーマットに “gg” を指定することで出力できる。

    サンプルコード

    ■和暦の年だけ(平成XX年のXXの部分)

     '和暦の年だけを取得する(元号は無し)
     Dim culture As Globalization.CultureInfo = New Globalization.CultureInfo("ja-JP")
     culture.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar
     
     Dim japanYear As String
     japanYear = Today.ToString("yy", culture)
    

    ■元号付の日付(平成XX年12月31日 の形式)

     '和暦を元号つきで取得する
     Dim culture As Globalization.CultureInfo = New Globalization.CultureInfo("ja-JP")
     culture.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar
     
     Dim japanDate As String
     japanDate = Today.ToString("ggyy年M月d日", culture)
    

    元号への変換も、.NET Frameworkが提供しているライブラリで
    変換できるのだから便利だ。
    気になるのは、.NET Frameworkのバージョンアップが早いこと。
    もし元号が変わってしまったら、そのとき、古い.NET Frameworkでも
    ちゃんとサポート(更新)されるのだろうか。

    提供されているフレームワークは便利な分、何かとのトレードオフになるので
    割り切るしかないだろう。
    でも、本当に西暦から元号への変換が楽だ。

  • ASP.NET(VB)アップロードされたファイルをDBに保存する方法

    ASP.NETでアップロードされたファイルを、DBに格納する方法のメモ。

    開発をしていて、データの保存場所に困ることがある。
    フォルダにそのまま格納しておくと分散が大変とか、
    ファイルの管理が大変とか、いろいろな悩みがあるだろう。
    その時の選択肢としてよく上がるのが、DBをストレージとして使う方法だ。
    ファイルとしてフォルダに置くのではなく、DBに格納し必要な時にSQLで取り出す。
    データはDBに保存してあるので、DBのバックアップを取っておけばOK。
    DBのパフォーマンスは気になるが、選択肢としてあるだろう。

    そんなとき、ASP.NETでアップロードされたファイルを直接DBに保存する。
    ファイルとしてサーバ上に置かなくていいので、ゴミもできない便利な方法だ。

    ■画面側

    まず、ASPX側にはFileUploadコントロールを配置する。(これのIDはFileUpload1とする)
    これで、ファイルを指定するボタンとファイルが指定されるテキストボックスができる。

    ■VB側の処理

    FileUploadコントロールのPostedFile.InputStreamメソッドでアップロードされたファイルを
    Streamオブジェクト(バイトデータ)として読み込むことができる。
    ただ読むことができる、いってもそのままDBに格納できるわけではないので、
    一度、変数に読み取ったバイトコードを格納し、それをSQLパラメータにいれる。
    わかってしまえば、どうということはない処理だ。

    ■サンプルコード

     Try
         'SQL Connectionの作成(参考:マスタページ側で処理してる)
         Dim dbCon As SqlConnection = New SqlClient.SqlConnection
         dbCon.ConnectionString = ConfigurationManager.ConnectionStrings("DBconnect").ConnectionString
         dbCon.Open()
         
         'Transactionの作成(参考:マスタページ側で処理してる)
         Dim dbTrans As SqlTransaction
         dbTrans = dbCon.BeginTransaction(IsolationLevel.ReadCommitted)
          
          
         'DBには、VarBinary型もしくはimage型のFileDataというカラムがある想定
          Dim sql As String = "INSERT INTO FileStorage (FileData) VALUES (@file)"
          
          Dim command As SqlCommand = New SqlCommand(sql, dbCon, dbTrans)
          
          'Byteデータとしてアップロードされたファイルを読み込む
          Dim binaryData(FileUpload1.PostedFile.InputStream.Length) As Byte
          FileUpload1.PostedFile.InputStream.Read(binaryData, 0, FileUpload1.PostedFile.InputStream.Length)
          command.Parameters.Add("@file", SqlDbType.VarBinary).Value = binaryData
          
         'SQLの実行
         Dim result As String
         result = command.ExecuteNonQuery()
         
         'SQL Connectionを閉じる。
         dbCon.Close()
     Catch ex As Exception
         dbCon.Close()
         
         Response.Write("失敗。。。")
     End Try
    
  • ASP.NET(VB) アップロードされたファイルがPDFファイルかどうか判別する方法

    ASP.NETでアップロードされたファイルの種類を判別する方法のメモ。
    拡張子で判別するなら、バリデーションコントロールを使ったほうが楽だが、
    ここではmimeタイプを使って判別する方法を書く。

    ■ASPX側

    まず、ASPX側にはFileUploadコントロールを配置する。(これのIDはFileUpload1とする)
    これで、ファイルを指定するボタンとファイルが指定されるテキストボックスができる。

    ■VB側の処理

    FileUploadコントロールのHasFileメソッドを使い、ファイルが指定されているかを判別する。
    次に、PostedFile.ContentTypeメソッドを使い、アップロードされたファイルのmimeタイプを取得し、
    mimeタイプが”application/pdf”であるかを判別する。
    (PDFファイルがアップロードされた場合、mimeタイプはapplication/pdfになる)

    ■サンプルコード

     'ファイルが指定されているかどうかの判別
     If FileUpload1.HasFile Then
         'PDFファイルが指定されているかどうかmimeタイプから判別する
         If FileUpload1.PostedFile.ContentType = "application/pdf" Then
             'PDFファイルだった場合は、ここの処理を実行する
     
     
         End If
     End If
    
  • VB.NETで消費税の計算をする

    消費税を計算する場合、原則として1円未満の場合は切り捨てを行う。
    (ただし、四捨五入も認められているので、四捨五入をしても間違えではない。)

    VBで消費税計算をする場合は、小数点以下を切り捨てるために Math.Floor() メソッドを使用する。

    ■例)

     Dim TaxRate As Double = 0.05
     Dim UnitPrice As Integer = 103
     Dim Total As Integer
     
     Total = Math.Floor(UnitPrice * TaxRate)
    

    ■結果:切り捨てしない場合には108.15、切り捨てにより108になる。

    計算結果に対して、Math.Floorメソッドを使うことにより、
    切り捨てた数をInteger型にいれることができる。

    ちなみに、小数点以下を切り上げしたい場合には、Math.Ceiling() メソッドを使う。

    他の方法としては、ToString() メソッドで小数点以下をまるめることもできる。
    変数.ToString(“C”) を指定することで、小数点以下を四捨五入することができる。

    ■例)

     Dim TaxRate As Double = 0.05
     Dim UnitPrice As Integer = 103
     Dim TotalTemp As Double
     Dim Total As Integer
     
     TotalTemp = UnitPrice * TaxRate
     Total = TotalTemp.ToString("C")
    

    この方法でも、小数点以下の表示はなくせるが、四捨五入になる。

  • .NET Framework 4.5のCLR

    .NET Framework 4.5では、CLRのバージョンが4.5になっており、独自のCLRとなった。
    .NET Frameworkは、2.0~3.5SPまでがCLR2.0、4.0がCLR4.0となっている。
    .NET Frameworkは実行環境がCLRのバージョンにより左右されるため、
    CLR4.0しか動作しないWindowsでは、.NET Framework4.5のアプリを
    動作させることができない。

    ただし、CLR4.0とCLR4.5は完全互換性があるとのこと。

    どちらにしても、基盤となるCLRのバージョンが違うため、
    開発などを進める際には注意が必要。
    互換性があるといっても、ベースになるバージョンが違うと実行できないはずなので、
    コンパイルのし直しなどは発生するはずだし、実行環境のアップデートが求められる。
    せめて、4系は同じCLRを使ってほしかったところではある。
    2系のように少し長いこと使えるようにしてくれると、
    開発する側はいろいろと楽なんだがね。