SQLの窓

2014年07月30日


VB.netとC# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する

基本的には、String.Format メソッドのお話ですが、文字列の配列の扱いとの関係での注意事項です。
-- ******************************
-- 社員マスタ更新
-- ******************************

UPDATE 社員マスタ
set 
	氏名 = '{1}',
	給与 = {2},
-- 行コメント
	生年月日 = {3}

where 社員コード = '{0}'

-- 行コメント

行コメントは、正規表現で削除します。{} 部分の個数より、配列が大きい必要があり、Nothing が指定されると、{} ごとなくなります。
※ 配列のリサイズが必要な場合は、Array.Resize メソッドで行います。

VB.net による記述
Imports System.IO
Imports System.Text

Module Module1

	Sub Main()

		' 入力ファイルのパス ( "入力ファイルのパス" と指定する )
		Dim arguments As String() = Environment.GetCommandLineArgs()
		' 引数は一つのみ許可
		If arguments.Length <> 2 Then
			Console.WriteLine("引数を指定して下さい")
			Return
		End If

		' 引数から取得
		Dim BaseFilePath As String = arguments(1)

		' *********************************
		' 主なエンコード
		' *********************************
		' SHIFT_JIS
		Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932)
		' EUC-JP
		Dim UJIS_Enc As Encoding = Encoding.GetEncoding(51932)
		' UNICODE 用
		Dim UNI_Enc As Encoding = Encoding.GetEncoding(1200)
		' UTF-8N
		Dim UTF8N_Enc As New UTF8Encoding()
		' UTF-8
		Dim UTF8_Enc As New UTF8Encoding(True)

		' *********************************
		' UTF-8N で読込み
		' *********************************
		' 読み込み用
		Dim ReadFile As StreamReader = New StreamReader(BaseFilePath, UTF8N_Enc)

		' 読込み
		Dim SqlText As String = ReadFile.ReadToEnd()
		Dim SqlWork As String = SqlText
		Dim SqlResult As String = Nothing

		' 全て読み込んでいるので閉じて解放
		ReadFile.Close()
		ReadFile.Dispose()

		' 行コメントの削除
		SqlWork = RegularExpressions.Regex.Replace( _
		 SqlWork, "([^\n-]*)--[^\n]*\n", "$1" _
		)

		' 改行が入っているので Write
		Console.Write(SqlWork)

		Dim rpl As String() = {"0001", "山田太郎", "100000", "'1980/01/01'"}
		Console.WriteLine("配列の数は {0} です", rpl.Length)

		Console.WriteLine("値を String.Format でセットします")
		SqlResult = String.Format(SqlWork, rpl)
		Console.Write(SqlResult)

		rpl(0) = "0002"
		rpl(1) = "山田花子"
		rpl(2) = "20000"
		rpl(3) = "NULL"
		SqlResult = String.Format(SqlWork, rpl)
		Console.Write(SqlResult)
		Console.WriteLine()

		rpl(0) = "0003"
		rpl(1) = "山田美子"
		rpl(2) = "20000"
		rpl(3) = "'1980/01/01'"
		SqlResult = String.Format(SqlWork, rpl)
		Console.Write(SqlResult)

		' *********************************
		' 終了処理
		' *********************************
		Console.WriteLine("処理が終了しました")

		' 一時停止
		Console.Write("Enterキーを押して下さい : ")
		Console.ReadLine()

	End Sub

End Module


C# による記述
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace StringFormat
{
	class Program
	{
		static void Main(string[] args)
		{
			// 入力ファイルのパス ( "入力ファイルのパス" と指定する )
			string[] arguments = Environment.GetCommandLineArgs();
			// 引数は一つのみ許可
			if ( arguments.Length != 2 ) {
				Console.WriteLine("引数を指定して下さい");
				return;
			}

			// 引数から取得
			string BaseFilePath = arguments[1];

			// *********************************
			// 主なエンコード
			// *********************************
			// SHIFT_JIS
			Encoding SJIS_Enc = Encoding.GetEncoding(932);
			// EUC-JP
			Encoding UJIS_Enc = Encoding.GetEncoding(51932);
			// UNICODE 用
			Encoding UNI_Enc = Encoding.GetEncoding(1200);
			// UTF-8N
			Encoding UTF8N_Enc = new UTF8Encoding();
			// UTF-8
			Encoding UTF8_Enc = new UTF8Encoding(true);

			// *********************************
			// UTF-8N で読込み
			// *********************************
			// 読み込み用
			StreamReader ReadFile = new StreamReader(BaseFilePath, UTF8N_Enc);

			// 読込み
			string SqlText = ReadFile.ReadToEnd();
			string SqlWork = SqlText;
			string SqlResult = null;

			// 全て読み込んでいるので閉じて解放
			ReadFile.Close();
			ReadFile.Dispose();

			// 行コメントの削除
			SqlWork = System.Text.RegularExpressions.Regex.Replace( 
				SqlWork, "([^\n-]*)--[^\n]*\n", "$1"
			);

			// 改行が入っているので Write
			Console.Write(SqlWork);

			string[] rpl = {"0001", "山田太郎", "100000", "'1980/01/01'"};
			Console.WriteLine("配列の数は {0} です", rpl.Length);

			Console.WriteLine("値を String.Format でセットします");
			SqlResult = String.Format(SqlWork, rpl);
			Console.Write(SqlResult);

			rpl[0] = "0002";
			rpl[1] = "山田花子";
			rpl[2] = "20000";
			rpl[3] = "NULL";
			SqlResult = String.Format(SqlWork, rpl);
			Console.Write(SqlResult);
			Console.WriteLine();

			rpl[0]= "0003";
			rpl[1] = "山田美子";
			rpl[2] = "20000";
			rpl[3] = "'1980/01/01'";
			SqlResult = String.Format(SqlWork, rpl);
			Console.Write(SqlResult);

			// *********************************
			// 終了処理
			// *********************************
			Console.WriteLine("処理が終了しました");

			// 一時停止
			Console.Write("Enterキーを押して下さい : ");
			Console.ReadLine();

		}
	}
}

引数は、プロジェクトのプロパティからデバッグタブを開けて設定します。





posted by lightbox at 2014-07-30 12:31 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする

2011年09月11日


VB.net : 「ファイルを開くダイアログ」のパラメータを単純なテキストファイルより取得する

テキストファイルは、メモ帳で以下のようにして作成します
C:\
HTML|*.html;*.htm|CSS|*.css|JavaScript|*.js|全てのファイル|*.*
4
★ ファイルを選択してください ★
True
True
True
True は、Boolean.Parse によって変換します。True と False 以外はエラーと なるので注意して下さい。 文字列配列による Split は第二引数にオプションが必要です。ここでは通常の StringSplitOptions.None を指定しています
Imports System.IO
Imports System.Text
Imports System.Windows.Forms

Module Module1

	Sub Main()

		' 文字列と Boolean 変換テスト
		Console.WriteLine(Boolean.TrueString)
		Console.WriteLine(Boolean.Parse("true"))

		Console.ReadLine()

		' パラメータファイルを一括読み込み
		Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932)
		Dim sr As StreamReader = New StreamReader("param.txt", SJIS_Enc)
		Dim text As String = sr.ReadToEnd()
		Console.WriteLine(text)
		sr.Close()

		' CRLF を区切り文字列としてテキストデータ全体を分割
		Dim stringSeparators As String() = {Microsoft.VisualBasic.Constants.vbCrLf}
		Dim myParamArray As String() = text.Split(stringSeparators, StringSplitOptions.None)

		For Each strMember As String In myParamArray
			Console.WriteLine(strMember)
		Next

		Console.ReadLine()

		' 取得した文字列の配列を使って「ファイルを開くダイアログ」を表示
		Dim ofd As New OpenFileDialog()

		ofd.InitialDirectory = myParamArray(0)
		ofd.Filter = myParamArray(1)
		ofd.FilterIndex = myParamArray(2)
		ofd.Title = myParamArray(3)
		ofd.RestoreDirectory = Boolean.Parse(myParamArray(4))
		ofd.CheckFileExists = Boolean.Parse(myParamArray(5))
		ofd.CheckPathExists = Boolean.Parse(myParamArray(6))

		'ダイアログを表示する
		If ofd.ShowDialog() = DialogResult.OK Then
			Console.WriteLine(ofd.FileName)
		End If

		Console.ReadLine()

	End Sub

	'C:\
	'HTML|*.html;*.htm|CSS|*.css|JavaScript|*.js|全てのファイル|*.*
	'4
	'★ ファイルを選択してください ★
	'True
	'True
	'True

End Module

関連する記事

VB.net での テキストファイルの読み書きを、
出力時のみキャラクタセット毎に条件コンパイル指定する


posted by lightbox at 2011-09-11 15:36 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする

2011年09月10日


VB.net での テキストファイルの読み書きを、出力時のみキャラクタセット毎に条件コンパイル指定する



以下のように指定した文字列を使用して条件コンパイルを行います

vbc.exe vbc_textfile.vb /define:SJIS_BUILD

主なエンコード として以下の5つのエンコードを使用します
1) SHIFT_JIS
2) EUC-JP
3) UNICODE
4) UTF-8N
5) UTF-8 ( BOM付き )
( パッケージ内に簡易ダンプを同梱してますので、インストールして BOM を確認できます ) 比較的小さなファイルの場合は、ReadFile.ReadToEnd() で一度に全てメモリに 取得するのが簡単ですが、大きなファイルは行単位で処理するのが通常です。
Imports System.IO
Imports System.Text

Module Module1

	Sub Main()

		' 入力ファイルのパス ( "入力ファイルのパス" と指定する )
		Dim arguments As String() = Environment.GetCommandLineArgs()
		' 引数は一つのみ許可
		if arguments.Length <> 2 then
			Console.WriteLine("引数を指定して下さい")
			Return
		end if

		' 引数から取得
		Dim BaseFilePath As String = arguments(1)

		' **************************************************
		' 主なエンコード
		' **************************************************
		' SHIFT_JIS
		Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932)
		' EUC-JP
		Dim UJIS_Enc As Encoding = Encoding.GetEncoding(51932)
		' UNICODE 用
		Dim UNI_Enc As Encoding = Encoding.GetEncoding(1200)
		' UTF-8N
		Dim UTF8N_Enc As New UTF8Encoding()
		' UTF-8
		Dim UTF8_Enc As New UTF8Encoding(True)

		' **************************************************
		' SHIFT_JISで読み、SHIFT_JIS で出力する
		' **************************************************
		' 読み込み用
		Dim ReadFile As StreamReader = New StreamReader( BaseFilePath, SJIS_Enc )
		' 書き込み用( 第二引数が False なので、上書き )

#If SJIS_BUILD Then
		Dim WriteFile As StreamWriter = New StreamWriter( BaseFilePath + ".txt", False, SJIS_Enc )
#End If
#If UJIS_BUILD Then
		Dim WriteFile As StreamWriter = New StreamWriter( BaseFilePath + ".txt", False, UJIS_Enc )
#End If
#If UNI_BUILD Then
		Dim WriteFile As StreamWriter = New StreamWriter( BaseFilePath + ".txt", False, UNI_Enc )
#End If
#If UTF8N_BUILD Then
		Dim WriteFile As StreamWriter = New StreamWriter( BaseFilePath + ".txt", False, UTF8N_Enc )
#End If
#If UTF8_BUILD Then
		Dim WriteFile As StreamWriter = New StreamWriter( BaseFilePath + ".txt", False, UTF8_Enc )
#End If

		' SHIFT_JIS で読み込み
		Dim LineText As String = Nothing
		' Peek() は、StreamReader オブジェクトの現在位置は変わりません
		' それ以上読み取り可能な文字がない場合、戻り値は -1 です。
		' 以下は、MSDN ライブラリでのサンプルコードと同じものです
		Do While ReadFile.Peek() >= 0
			LineText = ReadFile.ReadLine()

			WriteFile.WriteLine( LineText )
		Loop

		' **************************************************
		' 終了処理
		' **************************************************
		WriteFile.Close()
		WriteFile.Dispose()
		ReadFile.Close()
		ReadFile.Dispose()

		Console.WriteLine("処理が終了しました")

		' 一時停止
		Console.Write("Enterキーを押して下さい : ")
		Console.ReadLine()

	End Sub

End Module



タグ:VB.NET
posted by lightbox at 2011-09-10 15:01 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする

2011年09月07日


VB.net での DateDiff メソッドの使用方法

DateDiff 関数 : VBScript(Microsoft) 

DateDiff は、VBScript でも利用できるポピュラーなメソッドですが、Framework では、
引数は二通り用意されており、一つは VBScript と互換のあるデータ型で、もうひとつは
Framework の型を使ったものです。
Module Module1

	Sub Main()

		' DateDiff(日付差分)は、Microsoft.VisualBasic 名前空間の
		'  DateAndTime クラス内にあるメソッドで、VBScript でも定義されている関数

		Dim strBoundary As String = Nothing

		' VBScript でも実行可能な記述方法
		strBoundary = DateDiff("s", "1970/1/1 0:00:00", DateAdd("h", -9, Now))
		Console.WriteLine(strBoundary)

		' 上記結果を Framework に合った書き方で DateDiff する為に引数を用意
		Dim myDateTimeValue As String = "1970/1/1 0:00:00"
		Dim myDateTime As DateTime = DateTime.Parse(myDateTimeValue)
		Dim today As System.DateTime = System.DateTime.Now
		Dim duration As System.TimeSpan = New System.TimeSpan(0, -9, 0, 0)
		Dim target_date As System.DateTime = today.Add(duration)

		' Framework 用の実行
		strBoundary = DateDiff(DateInterval.Second, myDateTime, target_date)
		Console.WriteLine(strBoundary)

		Console.ReadLine()

	End Sub

End Module

関連する記事

VBScript で HTTPプロトコルで PHP へファイルをアップロードする方法


タグ:VB.NET DateDiff
posted by lightbox at 2011-09-07 11:39 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする

2010年07月06日


VB.net : 整数 : カンマ編集/前ゼロ/前スペース/16進数文字列変換

業務処理では、整数を3ケタ毎のカンマで編集表示する事は必ず必要です。また、前ゼロの編集は入力された値を文字列としてのコードとして編集するのに必要です。前スペースの編集は出力処理(主に印刷)の桁あわせに必要な場合があります。

さらに、元データとしては文字列である場合も多いので、いったん整数に変換してから編集する事も多くなると思います
vb.net>str_format.exe
||
|0|
|1,000,000|
------------------------------------
0
1,000,000
------------------------------------
1,000.123
------------------------------------
||
|0|
|1,000,000|
------------------------------------
A
a
------------------------------------
|A|
|a|
------------------------------------
|0010|
------------------------------------
|0010|
------------------------------------
     1,000
------------------------------------
1000000
1000000


Module MyModule

' ********************************
' 数字関係の編集処理
' ********************************
Sub Main()

	' ********************************
	' 整数をカンマ編集
	' ********************************
	Dim nData As Integer = 0

	' 1) 整数そのものを ToString
	' |(縦棒) は、編集文字以外なので、そのまま表示
	' ※ カスタム書式では、他の文字を混在できます
	Console.WriteLine( nData.ToString("|#,#|") )
	Console.WriteLine( nData.ToString("|#,0|") )
	nData = 1000000
	Console.WriteLine( nData.ToString("|#,0|") )

	Console.WriteLine( "------------------------------------" )


	' 以下のようなコードでも可能です( # のような機能はありません )
	' N0 の 0 は小数以下の精度です
	' ※ 標準書式では、他の文字を混在できません
	nData = 0
	Console.WriteLine( nData.ToString("N0") )
	nData = 1000000
	Console.WriteLine( nData.ToString("N0") )

	Console.WriteLine( "------------------------------------" )

	' Decimal は、10進数を表現するオブジェクトです
	' N0 の 0 は小数以下の精度です
	Dim decData As Decimal = 1000.12345
	Console.WriteLine( decData.ToString("N3") )

	Console.WriteLine( "------------------------------------" )

	' Format メソッド
	Console.WriteLine( String.Format( "|{0:#,#}|", 0  ) )
	Console.WriteLine( String.Format( "|{0:#,0}|", 0  ) )
	Console.WriteLine( String.Format( "|{0:#,0}|", 1000000  ) )

	Console.WriteLine( "------------------------------------" )

	' ********************************
	' 整数を16進数
	' ********************************
	nData = 10

	' 整数そのものを ToString( 大文字と小文字 )
	Console.WriteLine( nData.ToString("X") )
	Console.WriteLine( nData.ToString("x") )

	Console.WriteLine( "------------------------------------" )

	' Format メソッド( 大文字と小文字 )
	Console.WriteLine( String.Format( "|{0:X}|", 10  ) )
	Console.WriteLine( String.Format( "|{0:x}|", 10  ) )

	Console.WriteLine( "------------------------------------" )

	' ********************************
	' 整数を前ゼロコードに変換
	' この場合、固定長のコードに変換できます
	' ********************************
	nData = 10

	' 整数そのものを ToString(  )
	Console.WriteLine( nData.ToString("|0000|") )

	Console.WriteLine( "------------------------------------" )

	' Format メソッド( 大文字と小文字 )
	Console.WriteLine( String.Format( "|{0:0000}|", 10  ) )

	Console.WriteLine( "------------------------------------" )

	' ********************************
	' 整数を前スペース文字列に変換
	' 全ての言語共通の方法として、必要な文字列長のスペースを
	' 前につなげて右から必要な文字数の文字列を切り取ります
	' "     Z,ZZ9" (10ケタ) という文字列が欲しい場合
	' ********************************
	nData = 1000

	' まず、Z,ZZ9 部分を作成
	Dim str As String = nData.ToString("#,0")
	' 10ケタのスペースを連結
	str = "          " + str
	' 右から10ケタを取得
	str = str.Substring( str.Length - 10 )
	' 結果
	Console.WriteLine( str )

	Console.WriteLine( "------------------------------------" )


	' ********************************
	' 【補足】16進数文字列を整数に変換する : Integer.Parse
	' ********************************

	' A は 16進数 の 10
	Console.WriteLine( Integer.Parse("A", _
			System.Globalization.NumberStyles.HexNumber) * 100000 )

	' ********************************
	' 【補足】文字列を整数に変換する : Integer.Parse
	' ********************************

	Console.WriteLine( Integer.Parse("10" ) * 100000 )

End Sub

End Module



▼ C#
using System;

class MyModule {
    
    // ********************************
    //  
    // ********************************
    static void Main() {
        // ********************************
        //  
        // ********************************
        int nData = 0;
        Console.WriteLine(nData.ToString("|#,#|"));
        Console.WriteLine(nData.ToString("|#,0|"));
        nData = 1000000;
        Console.WriteLine(nData.ToString("|#,0|"));
        Console.WriteLine("------------------------------------");
        nData = 0;
        Console.WriteLine(nData.ToString("N0"));
        nData = 1000000;
        Console.WriteLine(nData.ToString("N0"));
        Console.WriteLine("------------------------------------");
        Decimal decData = 1000.12345m;
        Console.WriteLine(decData.ToString("N3"));
        Console.WriteLine("------------------------------------");
        Console.WriteLine(string.Format("|{0:#,#}|", 0));
        Console.WriteLine(string.Format("|{0:#,0}|", 0));
        Console.WriteLine(string.Format("|{0:#,0}|", 1000000));
        Console.WriteLine("------------------------------------");
        // ********************************
        //  
        // ********************************
        nData = 10;
        Console.WriteLine(nData.ToString("X"));
        Console.WriteLine(nData.ToString("x"));
        Console.WriteLine("------------------------------------");
        Console.WriteLine(string.Format("|{0:X}|", 10));
        Console.WriteLine(string.Format("|{0:x}|", 10));
        Console.WriteLine("------------------------------------");
        // ********************************
        //  
        // ********************************
        nData = 10;
        Console.WriteLine(nData.ToString("|0000|"));
        Console.WriteLine("------------------------------------");
        Console.WriteLine(string.Format("|{0:0000}|", 10));
        Console.WriteLine("------------------------------------");
        // ********************************
        //  
        // ********************************
        nData = 1000;
        string str = nData.ToString("#,0");
        str = ("          " + str);
        str = str.Substring((str.Length - 10));
        Console.WriteLine(str);
        Console.WriteLine("------------------------------------");
        // ********************************
        //  
        // ********************************
        Console.WriteLine((int.Parse("A", System.Globalization.NumberStyles.HexNumber) * 100000));
        // ********************************
        //  
        // ********************************
        Console.WriteLine((int.Parse("10") * 100000));
    }
}



タグ:VB.NET
posted by lightbox at 2010-07-06 12:16 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする

2010年06月28日


テキストファイルとキャラクタセットの処理


VB.net : テキストファイルとキャラクタセット
通常は、バイナリを意識せずにテキストを相互変換します。 一旦メモリ上の UNICODE に変換すると思えば良いでしょう。 Byte 配列は、他の処理からそういう形でしか用意されない場合に使用 しますが、結局大差はありません。エンコード指定は同じですし、ただ バイトとしての長さを意識するくらいです。 ※ FileStream に読み込む場合、長さを指定しないと 0x00 が1バイト付加されてしまいました キャラクタセット ■ SHIFT_JIS ■ UTF-8( BOM あり ) ■ UTF-8( BOM なし ) ■ EUC-JP ■ UNICODE ■ JIS
posted by lightbox at 2010-06-28 08:37 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり