SQLの窓

2019年08月14日


C# : Excel を データベースとして DataGridView に読み込む

※ Microsoft Office の Excel がインストールされている必要はありません

Microsoft.ACE.OLEDB.12.0 を使用して、OleDbConnection と OleDbCommand でデータベースとして処理します。テーブル名としては、シート名が使われますが、範囲指定して名前を定義しない限りは [シート名$] をテーブル
として使用します。( カギかっこは、Oracle で言うところのダブルクォートです )

Microsoft.ACE.OLEDB.12.0 がインストールされていない場合

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントをダウンロードしてインストールします。


( 32ビット版と64ビット版があるので選択してダウンロードします / ※ システム要件に 『32 ビット版の Access データベース エンジンは、Windows XP Service Pack 3 でしか使用できません』とあります。Windows7 では既にインストールされていると思われます )

▼ ダウンロードページの『インストール方法』より抜粋
OLEDB を使用するアプリケーション開発者: ConnectionString プロパティのプロバイダー引数を "Microsoft.ACE.OLEDB.12.0" に設定します。 

Microsoft Office Excel データに接続する場合は、Excel ファイル形式に基づいて OLEDB 接続文字列の適切な拡張プロパティを追加します 

ファイル形式 (拡張子)                                             拡張プロパティ
---------------------------------------------------------------------------------------------
Excel 97-2003 ブック (.xls)                                  "Excel 8.0"
Excel 2007-2010 ブック (.xlsx)                             "Excel 12.0 Xml"
Excel 2007-2010 マクロ有効ブック (.xlsm)      "Excel 12.0 Macro"
Excel 2007-2010 XML 以外のバイナリ ブック (.xlsb)      "Excel 12.0"
処理コード
public partial class FormExcelGridView : Form {

	private string path = null;

	public FormExcelGridView() {
		InitializeComponent();
	}

	private void buttonExcel_Click(object sender, EventArgs e) {

		path = Helper.OpenFileDialog();
		if (path == null) {
			return;
		}

		LoadExcel();

	}

	// *********************
	// Excel の読み込み
	// *********************
	private void LoadExcel() {

		using (OleDbConnection myCon = new OleDbConnection())
		using (OleDbCommand myCommand = new OleDbCommand()) {

			// SQL文字列格納用
			string myQuery = "select * from [sheet1$]";

			// 接続文字列の作成
			myCon.ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\"", path);
			Debug.WriteLine(myCon.ConnectionString);

			// *********************
			// 接続
			// *********************
			try {
				// 接続文字列を使用して接続
				myCon.Open();
				// コマンドオブジェクトに接続をセット
				myCommand.Connection = myCon;
				// コマンドを通常 SQL用に変更
				myCommand.CommandType = System.Data.CommandType.Text;
			}
			catch (Exception ex) {
				MessageBox.Show(this, ex.Message);
				return;
			}

			// *********************
			// 実行 SQL
			// *********************
			myCommand.CommandText = myQuery;

			// *********************
			// レコードセット取得
			// *********************
			try {
				using (OleDbDataReader myReader = myCommand.ExecuteReader()) {

					DataTable dataTable = new DataTable();
					dataTable.Load(myReader);
					dataGridView.DataSource = dataTable;

					// リーダを使い終わったので閉じる
					myReader.Close();
				}
			}
			catch (Exception ex) {
				myCon.Close();
				MessageBox.Show(this, ex.Message);
				return;
			}

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

		}	// 最外の using の終わり

		// カラム幅の自動調整
		dataGridView.AutoResizeColumns();

	}
}



Helpre クラス
class Helper {

	// https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-object-excel
	public const int xlMaximized = -4137;
	public const int xlMinimized = -4140;
	public const int xlNormal = -4143;

	public static string OpenFileDialog() {

		OpenFileDialog ofd = new OpenFileDialog();

		ofd.Filter = "Excel(*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm|すべてのファイル(*.*)|*.*";
		ofd.FilterIndex = 1;
		ofd.Title = "Excel ブックを選択してください";
		ofd.RestoreDirectory = true;

		if (ofd.ShowDialog() != DialogResult.OK) {
			return null;
		}

		return ofd.FileName;
	}
}


DataGridView のプロパティ
// 
// dataGridView
// 
this.dataGridView.AllowUserToAddRows = false;
this.dataGridView.AllowUserToDeleteRows = false;
this.dataGridView.AllowUserToOrderColumns = true;
this.dataGridView.AllowUserToResizeRows = false;
this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView.Location = new System.Drawing.Point(40, 113);
this.dataGridView.MultiSelect = false;
this.dataGridView.Name = "dataGridView";
this.dataGridView.ReadOnly = true;
this.dataGridView.RowTemplate.Height = 21;
this.dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridView.Size = new System.Drawing.Size(930, 443);
this.dataGridView.TabIndex = 0;


関連する記事

C# : dynamic 型 による Excel へのアクセス



【VS(C#)の最新記事】
posted by lightbox at 2019-08-14 00:12 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2019年08月12日


C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム



Form を非表示にするには、Application.Run() にフォームのインスタンスを渡さずに実行します

using System;
using System.Windows.Forms;

namespace HideFormApp
{
	static class Program
	{
		/// <summary>
		/// アプリケーションのメイン エントリ ポイントです。
		/// </summary>
		[STAThread]
		static void Main()
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Form1 form = new Form1();
			Application.Run();
		}
	}
}


終了できるように、アイコンを用意してメニューを登録します


using System;
using System.ComponentModel;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;

namespace HideFormApp
{
	public partial class Form1 : Form
	{

		private ContextMenu contextMenu;
		private MenuItem menuItem;
		private NotifyIcon notifyIcon;

		public Form1()
		{
			InitializeComponent();
			initClass();
		}

		private void initClass()
		{
			contextMenu = new ContextMenu();
			menuItem = new MenuItem();

			contextMenu.MenuItems.Add(menuItem);
			menuItem.Text = "終了";
			// 終了処理
			menuItem.Click += (Object sender, EventArgs e) => {
				notifyIcon.Visible = false;
				notifyIcon.Dispose();
				// プログラム終了
				Application.Exit();

			};

			// NotifyIcon : 通知領域にアイコンを作成するコンポーネント
			notifyIcon = new NotifyIcon(new Container());
			notifyIcon.Icon = new Icon(@"Resources\Icon1.ico");
			notifyIcon.Text = "lightbox";
			notifyIcon.Visible = true;
			// メニューをセット
			notifyIcon.ContextMenu = contextMenu;
		}

	}
}


Resources\Icon1.ico は、実行ファイルのある場所にコピーしたものです



posted by lightbox at 2019-08-12 20:09 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2019年06月24日


Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード



最初に .accdb か .mdb を選択しておいて、自由な SQL をタイプしてその結果をそのまま Excel のごとく DataGridView に表示します。

DataGridView に表示するデータは全て文字列扱いとして、ArrayList に随時行を追加して、Rows.Add に、ToArray() したものをセットします。

一応表示のみを想定しているので、以下の設定を最初にします


表示件数は多すぎると時間がかかりすきるので、固定で 100 件にしています。
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinApp1 {
	public partial class Form1 : Form {

		private OpenFileDialog ofd = new OpenFileDialog();

		public Form1() {
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e) {

			using (OleDbConnection myCon = new OleDbConnection())
			using (OleDbCommand myCommand = new OleDbCommand()) {

				// *********************
				// 接続文字列の作成
				// *********************
				myCon.ConnectionString = string.Format($"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={ofd.FileName};");
				Debug.WriteLine(myCon.ConnectionString);

				// *********************
				// 接続
				// *********************
				try {
					// 接続文字列を使用して接続
					myCon.Open();
					// コマンドオブジェクトに接続をセット
					myCommand.Connection = myCon;
					// コマンドを通常 SQL用に変更
					myCommand.CommandType = System.Data.CommandType.Text;
				}
				catch (Exception ex) {
					MessageBox.Show(this,ex.Message);
					return;
				}

				// *********************
				// 実行 SQL
				// *********************
				myCommand.CommandText = textBox1.Text;

				// *********************
				// レコードセット取得
				// *********************
				try {
					using (OleDbDataReader myReader = myCommand.ExecuteReader()) {

						// *********************
						// 列数
						// *********************
						int nCols = myReader.FieldCount;

						// DataGridView 初期化
						dataGridView1.Columns.Clear();
						dataGridView1.DataSource = null;
						dataGridView1.ColumnCount = nCols;		// カラム数

						Type fldType;
						ArrayList rowData = new ArrayList();

						// データ取得と表示
						int maxCount = 0;
						while (myReader.Read()) {

							// 行データをセットする ArrayList をクリア
							rowData.Clear();

							maxCount++;
							if ( maxCount > 100 ) {
								break;
							}

							// 初回のみ、タイトル文字列を設定
							if (maxCount == 1) {
								for (int idx = 0; idx < nCols; idx++) {
									dataGridView1.Columns[idx].Name = myReader.GetName(idx);
								}
							}

							// 行データの作成( ArrayList で作成して ToArray() したものを Rows.Add )
							for (int idx = 0; idx <nCols; idx++) {

								// NULL でない場合
								if (!myReader.IsDBNull(idx)) {
									// 列のデータ型を取得
									fldType = myReader.GetFieldType(idx);

									// 文字列
									if (fldType.Name == "String") {
										rowData.Add(myReader.GetValue(idx).ToString());
									}
									else if (fldType.Name == "Int32") {
										rowData.Add(myReader.GetInt32(idx).ToString());
									}
									else if (fldType.Name == "DateTime") {
										rowData.Add(myReader.GetDateTime(idx).ToString());
									}
									else {
										rowData.Add(myReader.GetValue(idx).ToString());
									}

								}
								else {
									rowData.Add("");
								}
							}

							// 行追加
							dataGridView1.Rows.Add(rowData.ToArray());

						}

						// リーダを使い終わったので閉じる
						myReader.Close();
					}
				}
				catch (Exception ex) {
					myCon.Close();
					MessageBox.Show(this, ex.Message);
					return;
				}

				myCon.Close();

				// カラム幅の自動調整
				dataGridView1.AutoResizeColumns();

			}		// 最外の using の終わり

		}

		private void button2_Click(object sender, EventArgs e) {

			// *********************
			// ファイル選択
			// *********************
			ofd.Filter = "Excel(*.mdb;*.accdb)|*.mdb;*.accdb|すべてのファイル(*.*)|*.*";
			ofd.FilterIndex = 1;
			ofd.Title = "Access データベースを選択してください";
			ofd.RestoreDirectory = true;

			if (ofd.ShowDialog() != DialogResult.OK) {
				return;
			}


		}		// click イベントの終わり

	}		// class の終わり
}


※ テーブル・ビュー一覧は以下のようにして簡単に表示できます
using (OleDbConnection myCon = new OleDbConnection())
using (OleDbCommand myCommand = new OleDbCommand()) {

	// *********************
	// 接続文字列の作成
	// *********************
	myCon.ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};", ofd.FileName);
	Debug.WriteLine(myCon.ConnectionString);

	// *********************
	// 接続
	// *********************
	try {
		// 接続文字列を使用して接続
		myCon.Open();
		// コマンドオブジェクトに接続をセット
		myCommand.Connection = myCon;
		// コマンドを通常 SQL用に変更
		myCommand.CommandType = System.Data.CommandType.Text;
	}
	catch (Exception ex) {
		MessageBox.Show(this,ex.Message);
		return;
	}

	DataTable dataTable = myCon.GetOleDbSchemaTable(
		OleDbSchemaGuid.Tables,
		new object[] { null, null, null, null }
	);
	// TABLE のみの場合は以下( 上記は 全て )
	//	new object[] { null, null, null, "TABLE" }

	dataGridView1.Columns.Clear();
	dataGridView1.DataSource = dataTable;

	myCon.Close();

	// カラム幅の自動調整
	dataGridView1.AutoResizeColumns();

}		// 最外の using の終わり

さらに SQL の実行結果は、データの途中加工が全くできなくなりますが、DataTable を使って以下のようにさらに短く記述する事ができます
// *********************
// 実行 SQL
// *********************
myCommand.CommandText = textBox1.Text;

try
{
	using (OleDbDataReader myReader = myCommand.ExecuteReader())
	{
		DataTable dataTable = new DataTable();

		dataTable.Load(myReader);

		dataGridView1.Columns.Clear();
		dataGridView1.DataSource = dataTable;

		myReader.Close();
	}

}
catch (Exception ex)
{
	myCon.Close();
	MessageBox.Show(this, ex.Message);
	return;
}

DataSource プロパティを使用した場合、新たに直接データをセットしていきたい場合は、いったん DataSource プロパティに null を設定しておく必要があります。


Microsoft.ACE.OLEDB.12.0 がインストールされていない場合

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントをダウンロードしてインストールします。


( 32ビット版と64ビット版があるので選択してダウンロードします )




posted by lightbox at 2019-06-24 19:53 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2019年05月18日


C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )

スタンダードな C# から ODBC を使用した読み取り処理のテンプレートです。

using System;
using System.Data.Odbc;

namespace MySQL
{
	class Program
	{
		static void Main(string[] args)
		{

			// 新しい OdbcConnection オブジェクトを作成
			OdbcConnection myCon = CreateConnection();

			if (myCon == null)
			{
				Console.WriteLine("処理が異常終了しました");
				return;
			}

			//---------------------------------------------------

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

			// SELECT 実行用のオブジェクトを作成
			OdbcCommand myCommand = new OdbcCommand();
			// 実行する為に必要な情報をセット
			myCommand.CommandText = myQuery;
			myCommand.Connection = myCon;

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

			// 読み出し
			// Rewad メソッドは、行が存在する場合は true、それ以外の場合は false を返します

			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();

			}

			myReader.Close();
			//---------------------------------------------------

			EndConnection(myCon);

		}

		// ******************************************************
		// 接続終了
		// ******************************************************

		static void EndConnection(OdbcConnection myCon)
		{
			// 接続を閉じる
			myCon.Close();

			// OdbcConnection オブジェクトに使用されているすべてのリソースを解放
			myCon.Dispose();

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

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

		}

		// ******************************************************
		// 接続作成
		// ******************************************************
		static OdbcConnection CreateConnection()
		{

			// 新しい OdbcConnectionStringBuilder オブジェクトを作成
			OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

			// ドライバ文字列をセット ( 波型括弧{} は必要ありません ) 
			// 文字列を正確に取得するには、レジストリ : HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
			builder.Driver = "MySQL ODBC 5.3 Unicode Driver";
			//builder.Driver = "MySQL ODBC 8.0 Unicode Driver";

			// 接続用のパラメータを追加
			builder.Add("SERVER", "localhost");
			builder.Add("DATABASE", "lightbox");
			builder.Add("UID", "root");
			builder.Add("PWD", "");

			// 内容を確認
			Console.WriteLine(builder.ConnectionString);

			// 新しい OdbcConnection オブジェクトを作成
			OdbcConnection myCon = new OdbcConnection();

			// 接続文字列を設定
			myCon.ConnectionString = builder.ConnectionString;

			// 接続を開く
			try
			{
				myCon.Open();
			}
			catch (OdbcException ex)
			{
				Console.WriteLine("接続エラーです");
				// Console.WriteLine( ex.Message )
				ErrorAction(ex);
				return null;
			}

			return myCon;

		}

		// ******************************************************
		// エラー処理
		// ******************************************************

		static void ErrorAction(OdbcException ex)
		{
			string CrLf = "\r\n";
			string errorMessages = "";
			int i = 0;

			for (i = 0; i <= ex.Errors.Count - 1; i++)
			{
				errorMessages += "Index #" + i.ToString() + CrLf + "Message: " + ex.Errors[i].Message + CrLf + "NativeError: " + ex.Errors[i].NativeError.ToString() + CrLf + "Source: " + ex.Errors[i].Source + CrLf + "SQL: " + ex.Errors[i].SQLState + CrLf;
			}

			Console.WriteLine(errorMessages);

		}


		// ********************************************************
		// 列データ取得
		//
		// 列データを文字列として取得しますが、NULL の場合は
		// 空文字列を返します
		// ********************************************************
		static string GetValue(OdbcDataReader myReader, string strName)
		{

			string ret = "";
			int fld = 0;

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

			// 列の値を返す
			return ret;

		}

	}
}


以下は、show create table で取得した MySQL用の テーブル作成用 SQL です。
CREATE TABLE `社員マスタ` (
  `社員コード` varchar(4) NOT NULL DEFAULT '',
  `氏名` varchar(50) DEFAULT NULL,
  `フリガナ` varchar(50) DEFAULT NULL,
  `所属` varchar(4) DEFAULT NULL,
  `性別` int(11) DEFAULT NULL,
  `作成日` datetime DEFAULT NULL,
  `更新日` datetime DEFAULT NULL,
  `給与` int(11) DEFAULT NULL,
  `手当` int(11) DEFAULT NULL,
  `管理者` varchar(4) DEFAULT NULL,
  `生年月日` datetime DEFAULT NULL,
  PRIMARY KEY (`社員コード`)
)




posted by lightbox at 2019-05-18 23:55 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2019年05月07日


jQuery : 貼り付けるだけで、ページ右下にページ先頭にジャンプするリンクを表示させる( アニメーションは無し )

このブログで実装しているものを jQuery に置き換えたものです。リンクは、スクロールしていない先頭では表示されませんが、少しスクロールすると表示されます。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(function(){

	// ページ右下固定位置のリンク
	var scroll_top = $("<a id='scroll_top'>▲</a>")
	scroll_top.prop("href","javascript:void(0)");
	scroll_top.css({ 
		"position": "fixed",
		"opacity": "0.5",
		"text-decoration": "none",
		"font-size" : "40px",
		"color" : "rgba(255,255,255,0.85)",
		"text-shadow" : "1px 1px 2px #656a6f",
		"right" : "3%",
		"bottom" : "5rem",
		"display" : "none"
	});

	// クリックした時の処理
	scroll_top.on("click", function(){
		window.scroll(0,0);
	});

	// ページの最後に追加
	$("body").append( scroll_top );

	// スクロールが無い先頭部分では表示しない
	$(window).on("scroll",function(){
		var scroll = $("html").scrollTop();
		if ( scroll <= 200 && $("#scroll_top").css("display") != "none" ) {
			$("#scroll_top").css("display","none");
		}
		if ( scroll > 200 && $("#scroll_top").css("display") == "none" ) {
			$("#scroll_top").css("display","");
		}
	});	

});
</script>







タグ:スクロール
posted by lightbox at 2019-05-07 22:01 | jQuery | このブログの読者になる | 更新情報をチェックする

2019年04月09日


clip.exe ( クリップボードにコマンドラインからのコマンドの出力をリダイレクトします )

使用方法は clip /? で表示されます
C:\Users\sworc>clip /?

CLIP

説明:
    コマンド ライン ツールの出力を Windows クリップボードにリダイレクトします。
    その出力されたテキストをほかのプログラムに貼り付けることができます。

パラメーター一覧:
    /?                  このヘルプを表示します。

例:
    DIR | CLIP          現在のディレクトリ一覧のコピーを Windows クリップボード
                        に貼り付けます。

    CLIP < README.TXT   readme.txt ファイルのテキストのコピーを Windows
                        クリップボードに貼り付けます。
一番有用で手近な利用方法は、レジストリに以下のように登録する事です。
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Folder\shell\flistcopy]
@="ファイル一覧をコピー"

[HKEY_CLASSES_ROOT\Folder\shell\flistcopy\command]
@="cmd.exe /c pushd \"%V\" & dir /a-d /b | sort | clip"


こうすると、フォルダを右クリックして現れる『ファイル一覧をコピー』を選択すると、そのフォルダ内の全てのファイルのみ( フォルダは排除しています )を、ファイル名のみでソートしてクリップボードにコピーします。

cmd.exe /c pushd "%V" & dir /a-d /b | sort | clip
Microsoft のドキュメント クリップ( Windows サーバー )
posted by lightbox at 2019-04-09 11:21 | コマンド : コマンド | このブログの読者になる | 更新情報をチェックする
container 終わり



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

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