SQLの窓

2011年09月04日


VB.net : COMの Msxml2.ServerXMLHTTP を使用して WEBアプリにデータを POST する



VB.net : COMの Msxml2.ServerXMLHTTP を使用して http 通信を行う で GET による通信処理
が可能になったので、POST 処理を実装しています。テストとしては同梱している php のコードを
使って localhost で行っていますが、一般の POST を行う WEB アプリに対しても利用できます
Imports System.Web
Imports myCom

Module Module1

	Sub Main()

		' http 通信用のオブジェクトを作成
		Dim ServerXML As New myCom.ServerXMLHTTP60()

		' 呼び出す URL を設定
		Dim URL As String = "http://localhost/api/url_rfc3986.php"

		' POST する為に開く
		ServerXML.open("POST", URL, False)
		' POST する為の http ヘッダをセット
		ServerXML.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")

		' タイムアウトの設定
		Dim lResolve As Integer = 60 * 1000
		Dim lConnect As Integer = 60 * 1000
		Dim lSend As Integer = 60 * 1000
		Dim lReceive As Integer = 60 * 1000
		ServerXML.setTimeouts(lResolve, lConnect, lSend, lReceive)

		' 変換元の文字列を引数から取得する
		' 空白を指定したい場合は、"文字列 文字列" のように指定する
		Dim arguments As String() = Environment.GetCommandLineArgs()
		' 引数は一つのみ許可
		if arguments.Length <> 2 then
			Console.WriteLine("引数を指定して下さい")
			Return
		end if

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

		' 送る為に文字列を URL エンコード( UTF-8 ) する
		' System.Web.HttpUtility.UrlEncode
		Dim PostData As String = "text=" + HttpUtility.UrlEncode(BaseData)
		' 送信するデータの長さを http ヘッダにセット
		ServerXML.SetRequestHeader("Content-Length",PostData.Length)
		' 送信
		ServerXML.send( PostData )

		' 結果の表示
		Console.WriteLine(ServerXML.responseText)

		Console.ReadLine()

	End Sub

End Module

この場合日本語の内部エンコードは、UTF-8 で行われます。他のエンコードを
行いたい場合は、HttpUtility.UrlEncode のドキュメントを参照して下さい

エラー処理
Try
	ServerXML.send( PostData )
Catch ex As Exception
	Console.WriteLine("実行エラーです")
	Console.WriteLine( ex.Message )
	Return
End Try
url_rfc3986.php Twitter の API(OAuth) で使われる URL エンコード用のコードです。 VB.net 側ではいずれにしても、URLENCODE は必要なので、一般的なものとして HttpUtility.UrlEncode で変換したものを送っています。
<?
if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
	header( "Content-Type: text/html; Charset=utf-8" );
}
else {
	header( "Content-Type: text/plain" );
}
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}

print url_rfc3986( $_POST['text'] );

// **********************************************************
// AOuth 用の urlencode 関数
// **********************************************************
function url_rfc3986( $str ) {
	// php 5.3.x 〜 ではこの変換は必要無い
	return str_replace('%7E', '~', rawurlencode($str));
}
?>
<? if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) { ?>
<form method="post">
<textarea name="text"></textarea>
<input type="submit">
</form>
<? } ?>

※ 処理のテストをできるように、アドレスバーから呼び出した場合は入力画面
※ が表示されます。入力して実行した結果が戻される値( text/plain ) です

以下は IE8 で送られた http ヘッダです
POST /api/url_rfc3986.php HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost/api/url_rfc3986.php
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost
Content-Length: 6
Connection: Keep-Alive
Cache-Control: no-cache

text=a

関連する記事

PHP/JavaScript/ASP/ps/py : 処理別の urlencode の結果の違い
VBScript : Seesaaの禁止ワード一括登録



posted by lightbox at 2011-09-04 12:01 | VB.NET : 通信 | このブログの読者になる | 更新情報をチェックする

2011年09月03日


VB.net 2008 : System.Data.Odbc データ取得(SELECT)処理( MySQL 5.1 )



以下のソースコードはデータ取得部分のみの記述です。接続処理等、その他のコードは上からダウンロードしてご確認下さい。

この処理の元となる記事

VB.net 2008 : System.Data.Odbc 接続テスト( MySQL 5.1 )
Sub Main()

	' 新しい OdbcConnection オブジェクトを作成
	Dim myCon As OdbcConnection = CreateConnection()

	if myCon is Nothing then
		Console.WriteLine("処理が異常終了しました")
		Return
	end if

	'---------------------------------------------------

	' レコードセットを取得する為の SQL を準備
	Dim myQuery As String = _
		"SELECT `社員マスタ`.*,DATE_FORMAT(`生年月日`,'%Y-%m-%d') as `誕生日`" _
		+ " from `社員マスタ`"

	' SELECT 実行用のオブジェクトを作成( クラスは更新用と同じです )
	' コンストラクタを使うと以下のようになります
	' Dim execCommand As New OdbcCommand( myQuery, myCon )
	Dim myCommand As OdbcCommand = New OdbcCommand()
	' 実行する為に必要な情報をセット
	myCommand.CommandText = myQuery
	myCommand.Connection = myCon

	' 実行後にレコードセットを取得する為のオブジェクトを作成
	Dim myReader As OdbcDataReader
	' ここで SELECT を実行してその結果をオブジェクトに格納する
	myReader = myCommand.ExecuteReader()

	' 読み出し
	' Rewad メソッドは、行が存在する場合は true、それ以外の場合は false を返します
	Do While myReader.Read()

		' 文字列
		Console.Write(GetValue(myReader,"社員コード") + " : ")
		Console.Write(GetValue(myReader,"氏名") + " : ")

		' 整数
		Console.Write(GetValue(myReader,"給与") + " : ")

		' 日付
		Console.Write(GetValue(myReader,"作成日") + " : ")
		Console.Write(GetValue(myReader,"更新日") + " : ")
		Console.Write(GetValue(myReader,"生年月日") + " : ")
		Console.Write(GetValue(myReader,"誕生日"))

		Console.WriteLine()

	Loop

	myReader.Close()


	'---------------------------------------------------

	Call EndConnection( myCon )



End Sub

' *************************************************
' 列データ取得
'
' 列データを文字列として取得しますが、NULL の場合は
' 空文字列を返します
' *************************************************
Function GetValue( myReader As OdbcDataReader, _
	strName As String) As String

	Dim ret As String = ""
	Dim fld As Integer = 0

	' 指定された列名より、テーブル内での定義順序番号を取得
	fld = myReader.GetOrdinal(strName)
	' 定義順序番号より、NULL かどうかをチェック
	If myReader.IsDBNull(fld) Then
		ret = ""
	Else
		' NULL でなければ内容をオブジェクトとして取りだして文字列化する
		ret = myReader.GetValue(fld).ToString()
	End If

	' 列の値を返す
	Return ret

End Function


SQL 実行部分は、読み込み部分が解りやすくなるように、エラー処理を省略しています


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

VB.net : COMの Msxml2.ServerXMLHTTP を使用して http 通信を行う

Msxml2.ServerXMLHTTP は、通常 VBScript で利用されるサーバー用のクラスで、CreateObject でインスタンスを作成します。Framework には同様のクラスが存在しますが、経験からするとこちらのほうが簡単で信頼性が高いです。



VB.net で COM を使用する場合は以下のように「参照」を設定する必要があります



html 等の http ヘッダを送れないファイルについては、urf-8 扱いになります(つまりutf-8以外のキャラクタセットで書かれていると日本語を正しく扱えません)。サーバー側で対応したい場合は、.htaccess で指定する事によって、キャラクタセットの設定を http ヘッダに追加できます。php 等のアプリケーションでは、http ヘッダに直接出力します

※ http ヘッダにキャラクタセットの情報があれば、自動的に日本語は処理されます
Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim ServerXML As New MSXML2.ServerXMLHTTP60()

        Dim URL As String = Me.TextBox1.Text
        ServerXML.open("GET", URL, False)

        Dim lResolve As Integer = 60 * 1000
        Dim lConnect As Integer = 60 * 1000
        Dim lSend As Integer = 60 * 1000
        Dim lReceive As Integer = 60 * 1000
        ServerXML.setTimeouts(lResolve, lConnect, lSend, lReceive)
        ServerXML.send()

        Me.TextBox2.Text = ServerXML.responseText

    End Sub
End Class


「参照」する正確な名前の確認は、以下の手順で行えます。

1) HKEY_CLASSES_ROOT から Msxml2.XMLHTTP の最新バージョンのエントリを探す
2) サブキーの CLSID から ID を取得
 この場合は Msxml2.XMLHTTP.6.0 で {88d96a0a-f192-11d4-a65f-0040963251e5}
3) HKEY_CLASSES_ROOT\CLSID のツリー内より該当するエントリを探す
4) そのエントリのサブキーの TypeLib より値を取得
※ この場合は {F5078F18-C551-11D3-89B9-0000F81FE221}
5) HKEY_CLASSES_ROOT\TypeLib のツリー内より該当するエントリを探す
6) 最新バージョンのサブキーより、名前を取得する
※ この場合は Microsoft XML, v6.0

以下は、Visual Studio を使用しないでビルドする為のパッケージです。
その場合は、COM をインポートするライブラリを手動で作成する必要があります。



関連する記事(ライブラリ作成)

.NET から COM を使う


Microsoft のドキュメント

IServerXMLHTTPRequest/ServerXMLHTTP Members( 英文 )
※ イベントはありません。メソッドとプロパティのみです
※ クッキーは自動的にやりとりされます

System.Net 名前空間


タグ:VB.NET HTTP com
posted by lightbox at 2011-09-03 11:30 | VB.NET : 通信 | このブログの読者になる | 更新情報をチェックする

2011年09月02日


VB.net 2008 : System.Data.Odbc 更新処理( MySQL 5.1 )



以下のソースコードは更新部分のみの記述です。接続処理等、その他のコードは上から
ダウンロードしてご確認下さい。

この処理の元となる記事

VB.net 2008 : System.Data.Odbc 接続テスト( MySQL 5.1 )
Sub Main()

	' 新しい OdbcConnection オブジェクトを作成
	Dim myCon As OdbcConnection = CreateConnection()

	if myCon is Nothing then
		Console.WriteLine("処理が異常終了しました")
		Return
	end if

	'---------------------------------------------------

	' 更新用の文字列を作成
	Dim myQuery As String = _
	"update `社員マスタ` set `生年月日` = '1982/01/01'" _
		+ " where `社員コード` = '0001'"

	' 更新用のオブジェクトを作成
	' コンストラクタを使うと以下のようになります
	' Dim execCommand As New OdbcCommand( myQuery, myCon )
	Dim execCommand As OdbcCommand = New OdbcCommand()
	' 実行する為に必要な情報をセット
	execCommand.CommandText = myQuery
	execCommand.Connection = myCon

	Dim ret As Integer
	' 実行
	Try
		ret = execCommand.ExecuteNonQuery()
	Catch ex As OdbcException
		Console.WriteLine("実行エラーです")
		' Console.WriteLine( ex.Message )
		Call ErrorAction( ex )
		' エラーが発生しても、接続を閉じる必要があるので、
		' 処理を継続します
	End Try

	' リソースを解放
	execCommand.Dispose()

	'---------------------------------------------------

	Call EndConnection( myCon )

End Sub

UPDATE、INSERT、DELETE の各ステートメントで、戻り値(ret)はそのコマンドの影響を
受ける行の数です。その他のステートメントでの戻り値は、-1 です。ロールバックが
発生した場合も、戻り値は -1 です。


タグ:MySQL
posted by lightbox at 2011-09-02 16:32 | 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 ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり