SQLの窓

2018年07月11日


MySQL Connector/Python の使用方法概要のまとめ

接続
import mysql.connector

# **************************************
# 接続 / 更新兼用
# **************************************
cnn = mysql.connector.connect(
	host='localhost',
	port=3306,
	db='lightbox',
	user='root',
	passwd='',
	charset="utf8",
	autocommit='True')

# データベース処理

# **************************************
# 接続解除
# **************************************
cnn.close()


MySQLCursor.fetchone() Method
このメソッドはクエリ結果セットの次の行を取得し、単一のシーケンスを返し、使用可能な行がない場合はNoneを返します。 

デフォルトでは返されたタプルはMySQLサーバから返されたデータで構成され、Pythonオブジェクトに変換されます。(カーソルが生のカーソルの場合そのような変換は行われません : 「cursor.MySQLCursorRawクラス」 )

fetchone メソッドは fetchall および fetchmany によって使用されます。 また、カーソルがイテレータとして使用さる場合にも使用されます。

次の例はカーソルをイテレータとして使用し、内部では fetchone  が使用されます。
cursor.execute("SELECT * FROM employees")
for row in cursor:
	print(row)
関数で処理
# ***************************
# 参照
# ***************************
def get_data( cnn ):

	log("get_data")

	cursor = cnn.cursor(dictionary=True)

	sql = f"""select
			社員コード,
			氏名,
			フリガナ,
			所属,
			性別,
			作成日,
			更新日,
			給与,
			手当,
			管理者,
			DATE_FORMAT(生年月日,'%Y/%m/%d') as 生年月日
		from 社員マスタ
		where 社員コード = '{forms("社員コード")}'"""

	log(sql)

	cursor.execute(sql)

	row = cursor.fetchone()

	if row is None:
		set("check_message", "データが存在しません")
		return False

	pplog(row)

	forms("氏名", row["氏名"])
	forms("フリガナ", row["フリガナ"])
	forms("給与", row["給与"])
	forms("生年月日", row["生年月日"])

	cursor.close()

	return True

pplog の結果
{'フリガナ': 'ウラオカ トモヤ',
 '作成日': datetime.datetime(2005, 9, 12, 0, 0),
 '性別': 0,
 '所属': '0003',
 '手当': 9000,
 '更新日': datetime.datetime(2005, 11, 28, 0, 0),
 '氏名': '浦岡 友也',
 '生年月日': '2001/01/10',
 '社員コード': '0001',
 '管理者': None,
 '給与': 80000}
MySQLCursor.execute() Method
このメソッドは指定されたデータベース操作(クエリまたはコマンド)を実行します。

タプルまたはディクショナリ(PHP:連想配列/Ruby:ハッシュ)の値は、SQL文字列内の変数にバインドされます。 

変数を%sまたは%(name)s として埋め込んで使用します。 
▼ 例
select_stmt = "SELECT * FROM employees WHERE emp_no = %(emp_no)s"
cursor.execute(select_stmt, { 'emp_no': 2 })

▼ 非推奨
execute は、multiがTrueの場合はイテレータを返します。
Pythonでは、単一の値を含むタプルにカンマを含める必要があります。
たとえば ('abc') はスカラとして評価され、('abc',)はタプルとして評価されます。
print( type(('abc')) )
print( type(('abc',)) )

▼ 処理結果
<class 'str'>
<class 'tuple'>
関数で処理
# ***************************
# 更新
# ***************************
def update_data( cnn ):
	log("update_data")

	cursor = cnn.cursor()

	# 文字列複数行連結
	sql = f"""update 社員マスタ set 
		氏名 = %s,
		フリガナ=%s,
		給与 = %s,
		生年月日 = %s
	where 社員コード = '{forms("社員コード")}'"""

	log( sql )

	try:
		data = (forms("氏名"), forms("フリガナ"), int(forms("給与")) , forms("生年月日") )
	
		log( data )
	
		cursor.execute(sql, data)
	except:
		error_info = str(sys.exc_info()[1])
		set("check_message", "更新に失敗しました : " + error_info)
		log(str(sys.exc_info()[0]))
		log(error_info)
		return False

	cursor.close()

	return True


sys.exc_info()
現在処理中の例外を示す 3 個のタプルを返します。

例外が発生している場合、(type, value, traceback) を返します。type は処理中の例外のクラス(BaseException のサブクラス)を示します。value は例外インスタンス (例外の型のインスタンス) を返します(エラーメッセージはここに格納されています)
▼ エラーメッセージ例(MySQL)
1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'aaa' at line 1
ログ関数
import pprint

# **************************************
# ログ出力
# **************************************
def log( message ):
	with open('debug.log', 'a') as f:
		print(message,end='\n',file=f)
	
# **************************************
# ログ出力( pprint )
# **************************************
def pplog( obj ):

	with open("debug.log", "a") as f:
		pprint.pprint(obj, stream=f)






posted by lightbox at 2018-07-11 13:39 | Python | このブログの読者になる | 更新情報をチェックする

2018年07月06日


WindowBuilder JFace : WEB より JSON を取得して Table に表示する

Okhttp(ダウンロード) を使用した HttpAccess クラス を使用して、WEB 上から JSON 文字列を取得して Table コントロールにデータの一覧を表示します。
(重要) Okio(ダウンロード) も必要です

JSON 文字列を オブジェクトに変換する為に、Google Gson(各バージョンダウンロードページ) を使用します

使用するのは fromJson メソッドのみです。
// ▼ オブジェクト化用クラス定義
// JSON のプロパティ名と 以下のフィールド名が一致します
private class MyData {
	String 社員コード;
	String 氏名;
	String フリガナ;
	String 所属;
	String 性別;
	String 作成日;
	String 更新日;
	String 給与;
	String 手当;
	String 管理者;
	String 生年月日;
}
--------------------------------------------------------
// ▼ 使用方法
// JSON 文字列 => オブジェクト用
Gson gson = new Gson();
 
// JSON では、{} が配列となっています
MyData[] array = gson.fromJson(s, MyData[].class);
--------------------------------------------------------
// ▼ データ( 一件分 )
[
    {
        "社員コード": "0001",
        "氏名": "山田 太郎",
        "フリガナ": "ウラオカ トモヤ",
        "所属": "0003",
        "性別": "0",
        "作成日": "2005-09-12 00:00:00",
        "更新日": "2005-11-28 00:00:00",
        "給与": "1002",
        "手当": "9000",
        "管理者": "0001",
        "生年月日": "2012\/03\/21"
    }
]
データを MyData のインスタンスとして取得した後、MyData のクラス定義より、java.lang.reflect.Field (getName メソッド) を使用してデータのタイトル用に MyData のフィールド名を取得します。さらに、get メソッドを使用してデータを取得して Table コントロールに反映させます。
// MyData のフィールドよりタイトルを作成
Field[] flds = MyData.class.getDeclaredFields();
int fldCount = 0;
for( Field fld : flds ) {
	// このクラス名 "Main" を排除
	if ( !fld.getType().getName().equals("Main") ) {
		// 列
		tableColumn = new TableColumn(table, SWT.NONE);
		// 表示幅
		tableColumn.setWidth(100);
		// タイトルとして、フィールド名
		tableColumn.setText(fld.getName());

		// 列数
		fldCount++;
	}
}
※ 1行目の getDeclaredFields メソッドは、java.lang.Class.getDeclaredFields

Table コントロールは、org.eclipse.swt.widgets.Table です。

▼ 列定義用
TableColumn
▼ 行データ用
TableItem
// 列数ぶん配列を作成
String[] columnData = new String[fldCount];
 
// データを一行ぶん作ったら...

// 行作成( Table と関係づけ )
tableItem = new TableItem(table, SWT.NONE);
// 列データを配列で一括設定( 配列で一括設定 )
tableItem.setText(columnData);

// public void setText(String[] strings)
// Sets the text for multiple columns in the table.
// Note: If control characters like '\n', '\t' etc. are used in the string, 
// then the behavior is platform dependent.
// 
// Parameters:
// strings - the array of new strings
※ メニューの作成は、『Pleiades Oxygen + WindowsBuilder で MySQL を使用して SQL(select) からデータの一覧を表示する』を参照して下さい。
import java.lang.reflect.Field;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

import com.google.gson.Gson;

public class Main extends ApplicationWindow {

	private Table table;
	private String url = "http://localhost/web/form/basic-php-0628-iframe-client/data.php";
	private HttpAccess httpAccess;

	// メニユーアイテム
	private Action action;

	private class MyData {
		String 社員コード;
		String 氏名;
		String フリガナ;
		String 所属;
		String 性別;
		String 作成日;
		String 更新日;
		String 給与;
		String 手当;
		String 管理者;
		String 生年月日;
	}

	// *******************************
	// コンストラクタ
	// *******************************
	public Main() {
		super(null);
		createActions();
		addMenuBar();
		httpAccess = new HttpAccess(url);
	}

	// *******************************
	// コントロール追加
	// *******************************
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.addControlListener(new ControlAdapter() {
			@Override
			public void controlResized(ControlEvent e) {

				Rectangle size = container.getClientArea();
				table.setSize(size.width-21, size.height-84);

			}
		});

		// *******************************
		// ボタン
		// *******************************
		Button btnNewButton = new Button(container, SWT.NONE);
		btnNewButton.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				table.removeAll();
				loadMySQL();
			}
		});
		btnNewButton.setBounds(10, 10, 75, 25);
		btnNewButton.setText("実行");

		// *******************************
		// テーブル
		// *******************************
		table = new Table(container, SWT.BORDER | SWT.FULL_SELECTION);
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDoubleClick(MouseEvent e) {

				int row_no = table.getSelectionIndex();
				// 行 は 0 以上
				if ( row_no >= 0 ) {

					// タイトル部分の表示
					TableColumn[] tableColumns = table.getColumns();
					for( TableColumn column: tableColumns ) {
						System.out.println( column.getText() );
					}

					// 行部分の表示
					TableItem tableItem = table.getItem(row_no);
					int columnCount = tableColumns.length;
					for( int i = 0; i < columnCount; i++ ) {
						System.out.println( tableItem.getText(i));
					}

				}
			}
		});
		table.setBounds(10, 41, 591, 333);
		table.setHeaderVisible(true);
		table.setLinesVisible(true);

		return container;
	}

	// *******************************
	// データ表示
	// *******************************
	protected void loadMySQL() {

		// 引数のインターフェイスが内部より呼ばれる
		httpAccess.sendGet(new HttpAccess.SendGetListener() {

			// インターフェイス内で定義したメソッド
			public void sendGetListener(String s) {
				
				if ( s.equals("{}")) { 
					MessageBox message = new MessageBox(Main.this.getShell(),SWT.OK);
					message.setMessage("データを取得できませんでした");
					message.open();
					return;
				}

				// JSON 文字列 => オブジェクト用
				Gson gson = new Gson();

				// JSON では、{} が配列となっています
				MyData[] array = gson.fromJson(s, MyData[].class);

				// 列定義用
				TableColumn tableColumn = null;

				// MyData のフィールドよりタイトルを作成
				Field[] flds = MyData.class.getDeclaredFields();
				int fldCount = 0;
				for( Field fld : flds ) {
					// このクラス名 "Main" を排除
					if ( !fld.getType().getName().equals("Main") ) {
						// 列
						tableColumn = new TableColumn(table, SWT.NONE);
						// 表示幅
						tableColumn.setWidth(100);
						// タイトルとして、フィールド名
						tableColumn.setText(fld.getName());

						// 列数
						fldCount++;
					}
				}

				// 行
				TableItem tableItem = null;

				// array に MyData の配列が格納されています
				for (MyData data: array) {

					// 列数ぶん配列を作成
					String[] columnData = new String[fldCount];

					// 配列参照用
					int idx = 0;
					// フィールド単位でデータを取得する
					for( Field fld : flds ) {
						// このクラス名 "Main" を排除
						if ( !fld.getType().getName().equals("Main") ) {
							try {
								if ( fld.get( data ) == null ) {
									// データが NULL の場合は空白
									columnData[idx] = "";
								}
								else {
									columnData[idx] = fld.get( data ).toString();
								}
							} catch (Exception e) {
								// エラーの場合は空白
								columnData[idx] = "";
							}
							idx++;

						}
					}

					// 行作成
					tableItem = new TableItem(table, SWT.NONE);
					// 列データを配列で一括設定
					tableItem.setText(columnData);

				}

			}

		});


	}

	// *******************************
	// メニューのアイテム
	// *******************************
	private void createActions() {
		// Create the actions
		{
			action = new Action("実行") {

				@Override
				public void run() {
					table.removeAll();
					loadMySQL();
				}

			};
		}
	}

	// *******************************
	// メニュー
	// *******************************
	@Override
	protected MenuManager createMenuManager() {
		MenuManager menuManager = new MenuManager("menu");

		MenuManager menuManager_item = new MenuManager("メニュー");
		menuManager.add(menuManager_item);
		menuManager_item.add(action);
		return menuManager;
	}

	// *******************************
	// エントリポイント
	// *******************************
	public static void main(String args[]) {
		try {
			Main window = new Main();
			window.setBlockOnOpen(true);
			window.open();
			Display.getCurrent().dispose();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// *******************************
	// Shell の初期処理
	// *******************************
	@Override
	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);
		newShell.setText("タイトル");
	}

	// *******************************
	// 画面の初期処理
	// *******************************
	@Override
	protected Point getInitialSize() {
		return new Point(800, 600);
	}
}



HttpAccess クラス

SendGetListener インターフェイスを定義して、JSON 文字列を受信した後の処理を、呼び出し元で処理させるようにしています。=> ※ listner.sendGetListener(data); の部分
import java.io.IOException;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class HttpAccess {

	private OkHttpClient okHttpClient;
	private String url;

	// 受信イベント
	public interface SendGetListener {
		abstract public void sendGetListener(String s);
	}

	// コンストラクタ
	public HttpAccess(String url) {

		this.okHttpClient = new OkHttpClient();
		this.url = url;

	}

	public HttpAccess() {
		this.okHttpClient = new OkHttpClient();
	}

	public void setUrl(String url) {
		this.url = url;
	}


	public void sendGet(SendGetListener listner) {

		// 汎用的に 初期値は {} としています
		String data = "{}";

		Request.Builder builder = new Request.Builder();
		builder.url(url);
		Request request = builder.build();

		Response response = null;
		try {
			response = HttpAccess.this.okHttpClient.newCall(request).execute();
			data = response.body().string();
		}
		catch (IOException e) {
			e.printStackTrace();
		}

		listner.sendGetListener(data);

	}

}


関連する記事

Pleiades Oxygen + WindowsBuilder で MySQL を使用して SQL(select) からデータの一覧を表示する






posted by lightbox at 2018-07-06 13:55 | java : WindowBuilder | このブログの読者になる | 更新情報をチェックする

2018年06月26日


バッチファイル(コマンドプロンプト)で使用できる特殊な3つの環境変数



昔、Windows の ヘルプとサポートセンターで コマンドシェル で検索すると、コマンドシェルの概要 というのがリストの中に出てきました。
1) %CD%
2) %ERRORLEVEL%
3) %RANDOM%
当然バッチファイル内でのプログラミング目的です。環境変数は、コマンド内で置き換えられてそのまま実行されるので以下のような使い方ができるので便利です
title ユーザーコマンドプロンプト / %cd%
これは、コマンドプロンプトのタイトルに現在のディレクトリを表示します。 cur.bat(laylaClass バッチ処理支援パッケージ) の中身です。 例えばユーザ変数に現在のカレントディレクトリへ戻るコマンドをセットします
set ROOT=cd %CD%
その後(同じドライブであれば)、cd コマンドであちこち移動しても %ROOT% と実行すれば、元に返ってこれます ※ 初期投稿 : 2009-08-28 17:56:27
posted by lightbox at 2018-06-26 16:12 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

2018年06月20日


WindowsBuilder の JFaceで アプリケーションウインドウとダイアログを使用した基本処理

WindowsBuilder のインストールとプロジェクトの作成

▼ 以下を参照して下さい
Pleiades All in One で、Windows アプリを作成する手順( WindowBuilder + Swing デザイナー or SWT デザイナー[JFace] )

ApplicationWindow を中央に表示
	@Override
	protected Point getInitialLocation(Point initialSize) {

		GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();

		// デスクトップのサイズ
		Point windowSize = new Point(
				env.getMaximumWindowBounds().width,
				env.getMaximumWindowBounds().height);
		Point position = new Point(0,0);

		// デスクトップの中心に表示します
		return new Point(
			position.x + ((windowSize.x - initialSize.x) / 2),
			position.y + ((windowSize.y - initialSize.y) / 2)
		);
	}

ダイアログの呼び出し

呼び出し先から、こちら側のコントロールにアクセスする為、識別する為に名前を setData でセットしています
		Button btnNewButton = new Button(container, SWT.NONE);
		btnNewButton.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				Dialog1 dialog = new Dialog1(getShell());
				int result = dialog.open();
				System.out.println(result);
			}
		});
		btnNewButton.setBounds(10, 10, 75, 25);
		btnNewButton.setText("New Button");
		btnNewButton.setData("name","Button1");



ダイアログを親ウインドウの中央に
	@Override
	protected Point getInitialLocation(Point initialSize) {

		Point windowSize = this.getShell().getParent().getSize();
		Point position = this.getShell().getParent().getLocation();

		return new Point(
			position.x + ((windowSize.x - initialSize.x) / 2),
			position.y + ((windowSize.y - initialSize.y) / 2)
		);
	}



ダイアログから親ウインドウにアクセス

対症療法なので正確では無いですが、parentShell.getChildren() の内容にもう少しチェックを追加すれば使用に問題は無いと思います。コンストラクタにウインドウのインスタンスを渡せば簡単ですが、汎用性はこちらのほうが勝ると思います。
	@Override
	protected void createButtonsForButtonBar(Composite parent) {
		Button button = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
		button.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {

				Shell parentShell = Dialog1.this.getParentShell();
				Control[] controls = parentShell.getChildren();
				Composite con = (Composite)controls[1];

				controls = con.getChildren();

				for( Control control: controls ) {
					Object name = control.getData("name");
					if ( name != null) {
						if ( name.toString().equals("Button1") ) {
							Button btn = (Button) controls[0];
							btn.setText("ボタン");
							break;
						}
					}
				}

				Dialog1.this.setReturnCode(Dialog.OK);
				Dialog1.this.close();

			}
		});
		Button button_1 = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
		button_1.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				Dialog1.this.setReturnCode(Dialog.CANCEL);
				Dialog1.this.close();
			}
		});
	}





posted by lightbox at 2018-06-20 20:02 | Pleiades | このブログの読者になる | 更新情報をチェックする

Pleiades Oxygen + WindowsBuilder で MySQL を使用して SQL(select) からデータの一覧を表示する

WindowsBuilder のインストールとプロジェクトの作成

Pleiades All in One で、Windows アプリを作成する手順( WindowBuilder + Swing デザイナー or SWT デザイナー[JFace] )

JFace の アプリケーションウインドウを追加します



パースペクティブを Java EE に変更



Oxygen で、WindowBuilder エディターにフォントの設定が効かないので、Java エディタも開いて併用します。
( Java エディタ では、CTRL + プラスキー でフォントが大きくなります )



使えないコントロールを削除

toolBarManager と statusLineManager はコードでしかメンテできそうにないので、メニューでテストは十分なので削除します。



関連する 必要ない Override メソッドも削除します



最後に必要なくなった呼び出し部分も削除します



▼ この時点で以下のようなソースになります( タイトルは変更しています )
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Main extends ApplicationWindow {

	// *******************************
	// コンストラクタ
	// *******************************
	public Main() {
		super(null);
		createActions();
		addMenuBar();
	}

	// *******************************
	// 画面作成
	// *******************************
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);

		return container;
	}

	// *******************************
	// コンストラクタからの初期処理
	// *******************************
	private void createActions() {

	}

	// *******************************
	// メニュー
	// *******************************
	@Override
	protected MenuManager createMenuManager() {
		MenuManager menuManager = new MenuManager("menu");
		return menuManager;
	}

	// *******************************
	// エントリポイント
	// *******************************
	public static void main(String args[]) {
		try {
			Main window = new Main();
			window.setBlockOnOpen(true);
			window.open();
			Display.getCurrent().dispose();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// *******************************
	// ウインドウ ( Shell )
	// *******************************
	@Override
	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);
		// ウインドウのタイトル
		newShell.setText("MySQL データ表示");
	}

	// *******************************
	// ウインドウサイズ
	// *******************************
	@Override
	protected Point getInitialSize() {
		return new Point(635, 405);
	}
}


テーブルのサイズをウインドウのサイズ変更と同期させる


protected Control createContents(Composite parent) {
	Composite container = new Composite(parent, SWT.NONE);
	container.addControlListener(new ControlAdapter() {
		@Override
		public void controlResized(ControlEvent e) {
			// org.eclipse.swt.graphics.Rectangle;
			Rectangle size = container.getClientArea();
			table.setSize(size.width-21, size.height-24);
		}
	});

	table = new Table(container, SWT.BORDER | SWT.FULL_SELECTION);
	table.setBounds(10, 10, 599, 322);
	table.setHeaderVisible(true);
	table.setLinesVisible(true);

	return container;
}
メニューをデザイナから追加します 1) MenuManager を選択 2) メニュー部分をクリック 3) 新規を選択 4) メニューアイテム部分をクリック 5) メニューアイテムが一つ作成される コードも同時に作成されているので、Override の run を追加して loadMySQL("select * from 社員マスタ"); を追加
// *******************************
// コンストラクタからの初期処理
// *******************************
private void createActions() {

	{
		action = new Action("New Action") {
			@Override
			public void run() {
				table.removeAll();
				loadMySQL("select * from 社員マスタ");
				
			}
		};
	}
}

protected void loadMySQL(String string) {
	
	
}
MySQL 処理部分 private Connection conn = null; private Statement stmt = null; private ResultSet rs = null; private int maxRows = 20;
	protected void loadMySQL(String string) {

		try {
			// MySQL Connector/J 接続
			conn = (Connection) DriverManager.getConnection(
				// mysql-connector-java-8.0.11 で serverTimezone が必要
				"jdbc:mysql://localhost/lightbox?user=root&password=&characterEncoding=UTF-8&serverTimezone=JST"
			);

			stmt = (Statement) conn.createStatement();
			rs = stmt.executeQuery(string);

			// select の結果の列情報の取得
			ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();

			// 列数
			int columnCount = rsmd.getColumnCount();

			// 前回のテーブル列を全て削除
			int tableColumnCount = table.getColumnCount();
			TableColumn tableColumnWork = null;
			for( int i = tableColumnCount - 1; i >= 0; i--) {
				tableColumnWork = table.getColumn(i);
				tableColumnWork.dispose();
			}

			// 列名
			TableColumn tableColumn = null;
			for( int i = 1; i <= columnCount; i++) {
				tableColumn = new TableColumn(table, SWT.NONE);
				tableColumn.setWidth(100);
				tableColumn.setText(rsmd.getColumnName(i));
			}

			TableItem tableItem = null;
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
			int countRow = 0;
			while( rs.next() && countRow < maxRows ) {

				countRow++;

				String[] columnData = new String[columnCount];

				for( int i = 1; i <= columnCount; i++) {

					if ( rsmd.getColumnTypeName(i).equals("DATETIME") ) {
						columnData[i-1] = sdf.format(rs.getDate(i));
					}
					else {
						columnData[i-1] = rs.getString(i);
					}

				}
				tableItem = new TableItem(table, SWT.NONE);
				tableItem.setText(columnData);
			}

			rs.close();
			stmt.close();
			conn.close();

		} catch (SQLException ex) {
			// handle any errors
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
	}

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

行をダブルクリックした時の行データの取得
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDoubleClick(MouseEvent e) {
				int row_no = table.getSelectionIndex();
				// 行 は 0 以上
				if ( row_no >= 0 ) {
					// タイトル部分の表示
					TableColumn[] tableColumns = table.getColumns();
					for( TableColumn column: tableColumns ) {
						System.out.println( column.getText() );
					}

					// 行部分の表示
					TableItem tableItem = table.getItem(row_no);
					int columnCount = tableColumns.length;
					for( int i = 0; i < columnCount; i++ ) {
						System.out.println( tableItem.getText(i));
					}
				}
				
			}
		});

関連する記事

WindowBuilder JFace : WEB より JSON を取得して Table に表示する




posted by lightbox at 2018-06-20 17:28 | Pleiades | このブログの読者になる | 更新情報をチェックする

C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )

※ 重要
Gmail では安全性の低いアプリの許可を『有効』にする必要があります

.NET用メール送受信クラスライブラリ (TKMP.DLL) 
※ 2011-10-01 時点で 3.0.1
※ 2018-06-20 時点で 3.1.8( 2017/02/15 作成 )

TKMP は、VB.net や C# から日本語環境を気にしないでメールの送受信が行える貴重なライブラリですが、IMAP に対応しておられるのに添付されているドキュメントや、WEB 上のサンプルコードにその記述がありませんでしたので作成しました。

※ IMAP は 2011/08/11 に対応されています。
オンラインドキュメント

C#
using System;
using TKMP.Net;
using TKMP.Reader;

namespace MailRecTestCs
{
    class Program
    {
        static void Main(string[] args)
        {
            // IMAP 用基本認証
            BasicImapLogon logon = new BasicImapLogon("アカウント", "パスワード");
            // IMAP 用ログイン( 993 は、SSL 用 )
            ImapClient client = new ImapClient(logon, "サーバードメイン", 993);

            // SSL で接続する
            client.AuthenticationProtocol = AuthenticationProtocols.SSL;

            // 接続
            client.Connect();

            // メールデータ一覧の取得
            IMailData[] md_i = client.GetMailList();

            // メールデータの数
            Console.WriteLine(md_i.Length);

            // メールデータの本文を取得
            MailReader reader = null/* TODO Change to default(_) if this is not a reference type */;
            System.IO.Stream Body_data = null;

            // 全て表示
            for (int i = 0; i <= md_i.Length - 1; i++)
            {

                // メッセージを読み込む( 同期処理 )
                md_i[i].ReadBody();

                // 読み出しの為にストリームを取得
                Body_data = md_i[i].DataStream;

                // メールリーダで本文を解析
                reader = new TKMP.Reader.MailReader(Body_data, false);

                // マルチパートの時は最初に見つかったテキストセクションの本文
                Console.WriteLine(reader.MainText);

                // ヘッダ情報の取得
                foreach (TKMP.Reader.Header.HeaderString headerdata in reader.HeaderCollection)
                {
                    if (headerdata.Name == "From")
                        Console.WriteLine(string.Format("From : {0}", headerdata.Data));

                    if (headerdata.Name == "Subject")
                        Console.WriteLine(string.Format("Subject : {0}", headerdata.Data));

                    if (headerdata.Name == "Date")
                    {
                        Console.WriteLine(string.Format("Date オリジナル : {0}", headerdata.Data));
                        string target = headerdata.Data;
                        // 日付データの最後に(おそらく)改行が含まれていたので (JST) + 1 で6バイト除去しています
                        target = target.Substring(0, target.Length - 6);
                        try
                        {
                            DateTime dt = System.DateTime.ParseExact(target, "ddd, d MMM yyyy HH':'mm':'ss zzz", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None);
                            Console.WriteLine(string.Format("Date : {0}", dt));
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("フォーマット変換できませんでした");
                        }
                    }
                }
            }

            // 接続解除
            client.Close();

            Console.ReadLine();
        }
    }
}

VB.net
Imports TKMP.Net
Imports TKMP.Reader

Module Module1

    Sub Main()

        ' IMAP 用基本認証
        Dim logon As BasicImapLogon = New BasicImapLogon("アカウント", "パスワード")
        ' IMAP 用ログイン( 993 は、SSL 用 )
        Dim client As ImapClient = New ImapClient(logon, "サーバードメイン", 993)

        ' SSL で接続する
        client.AuthenticationProtocol = AuthenticationProtocols.SSL

        ' 接続
        client.Connect()

        ' メールデータ一覧の取得
        Dim md_i As IMailData() = client.GetMailList()

        ' メールデータの数
        Console.WriteLine(md_i.Length)

        ' メールデータの本文を取得
        Dim reader As MailReader = Nothing
        Dim Body_data As System.IO.Stream = Nothing

        ' 全て表示
        For i As Integer = 0 To md_i.Length - 1

            ' メッセージを読み込む( 同期処理 )
            md_i(i).ReadBody()

            ' 読み出しの為にストリームを取得
            Body_data = md_i(i).DataStream

            ' メールリーダで本文を解析
            reader = New TKMP.Reader.MailReader(Body_data, False)

            ' マルチパートの時は最初に見つかったテキストセクションの本文
            Console.WriteLine(reader.MainText)

            ' ヘッダ情報の取得
            For Each headerdata As TKMP.Reader.Header.HeaderString In reader.HeaderCollection

                If headerdata.Name = "From" Then
                    Console.WriteLine(String.Format("From : {0}", headerdata.Data))
                End If

                If headerdata.Name = "Subject" Then
                    Console.WriteLine(String.Format("Subject : {0}", headerdata.Data))
                End If

                If headerdata.Name = "Date" Then
                    Console.WriteLine(String.Format("Date オリジナル : {0}", headerdata.Data))
                    Dim target As String = headerdata.Data
                    ' 日付データの最後に(おそらく)改行が含まれていたので (JST) + 1 で6バイト除去しています
                    target = target.Substring(0, target.Length - 6)
                    Try
                        Dim dt As DateTime = System.DateTime.ParseExact(target, "ddd, d MMM yyyy HH':'mm':'ss zzz", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None)
                        Console.WriteLine(String.Format("Date : {0}", dt))
                    Catch ex As Exception
                        Console.WriteLine("フォーマット変換できませんでした")
                    End Try
                End If
            Next

        Next

        ' 接続解除
        client.Close()

        Console.ReadLine()

    End Sub


End Module

関連する Microsfot のドキュメント

POP3 アクセス用および IMAP4 アクセス用の TLS と SSL の構成: Exchange 2010 SP1 のヘルプ




posted by lightbox at 2018-06-20 11:05 | VS(C#) | このブログの読者になる | 更新情報をチェックする
container 終わり

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

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