Rakuten

  • 楽天ダウンロード

    楽天市場

おすすめ本

天気予報

最近のトラックバック

  • event (夢茶爺&苦茶爺のPC奮戦備忘録)

カウンタ

VC

admax

カテゴリ「SQL-Server」の10件の記事 Feed

2016年3月26日 (土)

VB.NET:ADO.NETを使用したSQL-ServerのテーブルのCSV出力

ADO.NET を使用した SQL-Server のテーブルをCSVファイルに出力する簡単な関数を作成してみました。

CSVファイルを作成する関数への引数は、データベース名とデータソース名と、SQL文、それとCSVファイル名とCSV内のカラムヘッダを 出力するかのフラグになります。

CSV出力処理関数内では SQL-Server への接続をオープンし、指定されたSELECT文を実行します。 SELECT文の結果の行が在れば、1行づつデータを取得します。 初回の行の処理の場合には、リーダーオブジェクトからカラム名を取得しヘッダ行を書き込みます。 その後、各データ行をCSVファイルに書き込みます。 CSVの各データは強制的にダブルクォートで囲む様にしていますので、 データ内のダブルクォートはエスケープ処理しています。


尚、今回のテーブルは以下の生成文で生成しました。

結果的にCSVファイル内容は以下の様になります。


■関連記事
BCPコマンドでUnicode文字形式を使用したデータのインポート及びエクスポート(SQL Server)について
ADO.NET での DataReader の入れ子エラー
ADO.NET を使用した SQL-Server へのアクセス・クラス
SQL-Serverの自動採番(IDENTITY値)の取得・リセット
SQL-Serverのストアド・ファンクションではUPDATEなどが実行できない
SQL-Serverのユーティリティ(BCPコマンド)を利用したテーブルへのインポート・エキスポート
SQL-Serverのプロシージャ生成のバッチ実行
SQL-Serverの関数・プロシージャのVB.NETでの実行

デル株式会社

2016年2月17日 (水)

BCPコマンドでUnicode文字形式を使用したデータのインポート及びエクスポート(SQL Server)について

以前の記事の中で「SQL Server」の「BCP」コマンドを取り上げましたが、 その時のコマンドは以下の様になっていました。 このコマンドは出力されるファイルが文字形式として書き込まれます。 (データベースの中のネイティブ形式ではないということです) このコマンドで出力されるテキストファイルのコードは「Shift-JIS」形式になるはずです。
これに対応するインポートコマンドは同様に「-c」オプションをつけて以下の様になります。 今回はUnicodeでのインポート・エクスポートの必要がありましたので、「-c」オプションを「-w」に変えて行います。
以下はエキスポートコマンドです。 このコマンドで出力されるテキストファイルのコードがUnicodeとなります。
以下はインポートコマンドです。

■関連記事
VB.NET:ADO.NETを使用したSQL-ServerのテーブルのCSV出力
ADO.NET での DataReader の入れ子エラー
ADO.NET を使用した SQL-Server へのアクセス・クラス
SQL-Serverの自動採番(IDENTITY値)の取得・リセット
SQL-Serverのストアド・ファンクションではUPDATEなどが実行できない
SQL-Serverのユーティリティ(BCPコマンド)を利用したテーブルへのインポート・エキスポート
SQL-Serverのプロシージャ生成のバッチ実行
SQL-Serverの関数・プロシージャのVB.NETでの実行

達人に学ぶDB設計 徹底指南書【電子書籍】[ ミック ]

価格: 2,808円
(2016/09/29 13:53時点 )

感想:1件


2015年12月 2日 (水)

Windows7のIIS(インターネット・インフォメーション・サービス)インストール

仕事で使うことがあって、久々にIISなどというものをWindows7でインストールしてみました。
まず最初に、IISそのものをインストールします。

■IISをコントロールパネルから有効にする

1.コントロールパネルの「プログラム」をクリックします。

Ctrl1_2

2.「Windows の機能の有効化または無効化」をクリックします。

Ctrl2

3.「Windows の機能」ウィンドウが表示されたら、
  「インターネット インフォメーション サービス」にチェックをつけ、[OK] をクリックします。
  このとき「ASP.NET」の機能が必要だったので、「インターネット インフォメーション サービス」内の
  「World Wide Web サービス」⇒「アプリケーション開発機能」⇒「ASP.NET」にチェックを入れました。
  その他、必要な機能が在れば該当するところにチェックを入れます。
  この機能の有効化には結構時間が掛かりますので、暫く待ちます。

Ctrl3

4.インストールが終わったら、ブラウザを立ち上げてURLに「http://localhost/」と入力します。
  インストールに問題が無ければ、以下のページが表示されるはずです。

Ctrl4

■ASP.NETで作成したプログラムをIISに登録する

1.スタートメニューから「管理ツール」の「インターネット インフォメーション サービス(IIS)マネージャー」をクリックする。

Ctrl5

2.「サイト」フォルダ内の「Default Web Site」上で右クリックし、メニューから「アプリケーションの追加...」をクリックする。

Iis1

3.「アプリケーションの追加ウインドウ」が開くので、エイリアスと物理パスを設定します。

Iis2

4.「Default Web Site」の配下にエイリアスの名前ができていればOKです。

Iis3


■「HTTP エラー 500.19 - Internal Server Error ページに関連する構成データが無効であるため、要求されたページにアクセスできません」のエラー発生
IISの設定は終わったのですが、なぜかHTTPエラーの500.19が発生しました。

あるブログからの引用なのですが、以下の処理でエラーが解消されるようです。

・定義ファイル
%windir%\system32\inetsrv\config\applicationHost.config

・変更内容
<sectionGroup name="system.webServer"> セクションの以下の項目が、デフォルトでは"Deny"になっているので"Allow"に変更する。

  <section name="handlers" overrideModeDefault="Allow" />
  <section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />

この変更後、HTTPエラーは出なくなりました。


■MSSQLでのIIS用のユーザを作成する
ここまでの設定で、「http://localhost/TEST/Index.apsx」でログイン画面が表示されたのですが、ログイン処理を行うとデータベースエラーが発生しました。

Log1_2

Log2


MSSQLにIISから接続するユーザが設定されていない様なので、「Microsoft SQL Server Management Studio」を起動し「セキュリティ」の中の「ログイン」で「新しいログインの追加..」をクリックしIIS用のログインを追加します。


Sql1

ログインの追加ウインドウ

Sql2


ログインの追加後はデータベースへのアクセスが成功するはずです。

2015年5月23日 (土)

ADO.NET での DataReader の入れ子エラー

ADO.NETを利用してSQL-Serverをアクセスするプログラムを組む場合に、データ参照のために DataReader を使用します。
一連のデータ処理では DataReader からのデータ取得をループで処理しますが、そのループ内で更にマスタ等のデータを 参照したくなることはよくあります。
この場合、同じコネクションを使いたくなり DataReader の処理中に更に DataReader を入れ子で使うことになったのですが 以下のエラーが発生しました。

System.InvalidOperationException: このコマンドに関連付けられている DataReader が既に開かれています。このコマンドを最初に閉じる必要があります。

この DataReader を入れ子で使えないかと調べたら、接続文字列の中に以下の指定を行えばできることがわかりました。

MultipleActiveResultSets=True

以前、このブログの中で 「ADO.NET を使用した SQL-Server へのアクセス・クラス」を載せていますが、接続文字列は以下の様な感じがいいと思います。

Persist Security Info=false;Integrated Security=SSPI;MultipleActiveResultSets=True;Initial Catalog=[DataBase-Name];Data Source=[DataSource-Name];

■関連記事
VB.NET:ADO.NETを使用したSQL-ServerのテーブルのCSV出力
BCPコマンドでUnicode文字形式を使用したデータのインポート及びエクスポート(SQL Server)について
ADO.NET を使用した SQL-Server へのアクセス・クラス
SQL-Serverの自動採番(IDENTITY値)の取得・リセット
SQL-Serverのストアド・ファンクションではUPDATEなどが実行できない
SQL-Serverのユーティリティ(BCPコマンド)を利用したテーブルへのインポート・エキスポート
SQL-Serverのプロシージャ生成のバッチ実行
SQL-Serverの関数・プロシージャのVB.NETでの実行


富士通パソコンFMVの直販サイト富士通 WEB MART


2015年3月18日 (水)

ADO.NET を使用した SQL-Server へのアクセス・クラス

ADO.NET を使用した SQL-Server へのアクセス・クラスの簡単なものを作成してみました。
このクラスを元にして拡張したものを仕事でも使っています。

このクラス「clsSqlServer」には以下のメソッド・プロパティが備わっています。

メソッド・プロパティ 概要
New コンストラクタ(引数にデータベース接続文字列を渡す)
BeginTransaction トランザクション開始
Commit トランザクションコミット
Rollback トランザクションロールバック
CloseConnection コネクションの解除
OpenDataReader SELECT文SQLの実行とDataReaderへの読込
CloseDataReader DataReaderのクローズ
ExeSQL DML-SQL文の実行
CnvReaderToHashtable DataReaderの結果ItemsをHashtableに変換



今回のクラスのテストプログラムを以下に載せますが、SQLサーバへの接続文字列は以下の様にしています。

キーワード 概要(設定値)
Persist Security Info ID やパスワードなどのセキュリティ関連情報の破棄指定(False)
Integrated Security 現在のWindowsアカウントでの認証(SSPI)
Database データベース名(取敢えず「TEST」)
Data Source SQL Serverのインスタンスの名前
(Microsoft SQL Server Management Studio Express:.\SQLEXPRESS)



このテストは、システム日付をSELECTで実行し、SqlDataReaderに取得しています。SqlDataReaderから日付を取り出して その後、クラスのクローズを行っています。

■「clsSqlServer」の使用テストソース1


以下に、clsSqlServerの全体のソースを載せます。バグがあるかもしれませんが悪しからず。

■「clsSqlServer」のソース

■関連記事
VB.NET:ADO.NETを使用したSQL-ServerのテーブルのCSV出力
BCPコマンドでUnicode文字形式を使用したデータのインポート及びエクスポート(SQL Server)について
ADO.NET での DataReader の入れ子エラー
SQL-Serverの自動採番(IDENTITY値)の取得・リセット
SQL-Serverのストアド・ファンクションではUPDATEなどが実行できない
SQL-Serverのユーティリティ(BCPコマンド)を利用したテーブルへのインポート・エキスポート
SQL-Serverのプロシージャ生成のバッチ実行
SQL-Serverの関数・プロシージャのVB.NETでの実行


2013年2月27日 (水)

SQL-Serverの自動採番(IDENTITY値)の取得・リセット

システムに必要なテーブルで、自動的に番号を振っていくものが必要なときがあります。 たとえば、各種の伝票データの伝票番号の様なものです。

プログラム処理上、データを登録した直後に、自動採番された値を取得し何かに使いたいことがよくあります。
SQL-Serverでは現在の自動採番の値を取得する方法が用意されています。

取敢えず自動採番を行える簡単なテーブルの例を示します。(前回ストアド・ファンクションで使用したテーブルに細工します。)



まず、テストテーブルBに1件データを挿入します。 「ID」は自動採番の設定なので登録する値は設定しません。
■自動採番された値を取得
この直後に、設定された「ID」値を取得するには以下のSELECT文を実行します。
結果として「1」という値が返されます。

■自動採番された値をリセット
デバッグ途中でテーブルのデータを全て削除して、さらに自動採番が「1」からにしたい場合はよくあります。 そのときに以下の命令をクエリアナライザ等で実行します。
自動採番の値を「0」にする命令ですが、実際INSERT実行時には+1された値が「ID」に設定されます。

■関連記事
VB.NET:ADO.NETを使用したSQL-ServerのテーブルのCSV出力
BCPコマンドでUnicode文字形式を使用したデータのインポート及びエクスポート(SQL Server)について
ADO.NET での DataReader の入れ子エラー
ADO.NET を使用した SQL-Server へのアクセス・クラス
SQL-Serverのストアド・ファンクションではUPDATEなどが実行できない
SQL-Serverのユーティリティ(BCPコマンド)を利用したテーブルへのインポート・エキスポート
SQL-Serverのプロシージャ生成のバッチ実行
SQL-Serverの関数・プロシージャのVB.NETでの実行


2013年2月14日 (木)

SQL-Serverのストアド・ファンクションではUPDATEなどが実行できない

当然といえばそうなのかもしれませんが、SQL-Serverのストアド・ファンクションではUPDATEなどが実行できない。
TRY・・・CATCHも記述できないようです。関数は戻り値のみを返すもので、テーブル等に変更を与えてはいけないのでしょう。

さて、取敢えずストアド・ファンクションの簡単な例を示します。

前回使用したテストテーブルを利用して、ストアド・ファンクションを作成します。テーブルの構造は以下の感じです。
■スカラ値関数

テストテーブルAを利用した簡単な値を返すストアド・関数です。
与えられた検索用IDでテーブルAの「DATA1」カラムの内容を返す簡単な関数です。 SELECT文での実行は以下のようにします。
======================================
SELECT [dbo].[FuncTest2](1)
======================================

■テーブル値関数その1(インラインテーブル値)

テストテーブルAを利用した簡単な値を返すストアド・関数です。
SELECT文のFROM句で実行しますので、以下のようになります。
======================================
SELECT * FROM [dbo].[FuncTest3](1)
======================================

■テーブル値関数その2(複数の行を返すテーブル値)

テストテーブルAを利用した複数の行を返すストアド・関数です。
指定されたID以降のデータを全て返す様な動作を行います。
RETURNS句で指定されたTABLEにINSERTしていくことで、結果をテーブルの値として返します。
INSERTで追加してやればいろんなことができると思います。上の例ではコメント行になっていますが、 強制的にID「0」を作成することも可能です。
この関数の実行も「テーブル値関数その1」で行った方法と同様です。


■スカラ値関数にUPDATE文を記述
SQL実行結果として以下のエラーメッセージが表示されます。
============================================================
メッセージ 443、レベル 16、状態 15、プロシージャ FuncTest2、行 8
副作用のある演算子または時間に依存する演算子を関数内の 'UPDATE' で使用することはできません。
============================================================

TRY、CATCHを入れてもエラーが表示され使用出来ないようです。
SQL実行結果として以下のエラーメッセージが表示されます。
============================================================
メッセージ 443、レベル 16、状態 14、プロシージャ FuncTest2、行 6
副作用のある演算子または時間に依存する演算子を関数内の 'BEGIN TRY' で使用することはできません。
メッセージ 443、レベル 16、状態 14、プロシージャ FuncTest2、行 9
副作用のある演算子または時間に依存する演算子を関数内の 'END TRY' で使用することはできません。
メッセージ 443、レベル 16、状態 14、プロシージャ FuncTest2、行 10
副作用のある演算子または時間に依存する演算子を関数内の 'BEGIN CATCH' で使用することはできません。
メッセージ 443、レベル 16、状態 14、プロシージャ FuncTest2、行 11
副作用のある演算子または時間に依存する演算子を関数内の 'END CATCH' で使用することはできません。
============================================================


副作用のある処理をファンクションのなかでは記述できないので、 どうしても処理したいのであれば、ストアド・プロシージャとして作成するしかないようです。
そこで、結果として何かを返したいのであれば、引数に出力属性のものを持つしかありません。

また、プロシージャの中からファンクションを実行することはできますが、ファンクションの中から プロシージャを実行することはできないようです。
ファンクションのコールが入れ子になっていて、深いところでUPDATEなどを行いたい場合、 全てのファンクションをプロシージャにしないといけなくなってきます。
このあたりは、ファンクション、プロシージャの切り分けをしっかりしておく必要がありそうです。

■関連記事
VB.NET:ADO.NETを使用したSQL-ServerのテーブルのCSV出力
BCPコマンドでUnicode文字形式を使用したデータのインポート及びエクスポート(SQL Server)について
ADO.NET での DataReader の入れ子エラー
ADO.NET を使用した SQL-Server へのアクセス・クラス
SQL-Serverの自動採番(IDENTITY値)の取得・リセット
SQL-Serverのユーティリティ(BCPコマンド)を利用したテーブルへのインポート・エキスポート
SQL-Serverのプロシージャ生成のバッチ実行
SQL-Serverの関数・プロシージャのVB.NETでの実行


2013年2月12日 (火)

SQL-Serverのユーティリティ(BCPコマンド)を利用したテーブルへのインポート・エキスポート

SQL-Serverのテーブルの内容を簡単にインポート・エキスポートできる、ユーティリティ(BCP)の忘備録です。

BCPはコマンドラインで使用するEXEファイルで、MSSQLをインストールした時点でユーティリティとして "C:\Program Files\Microsoft SQL Server\90\Tools\Binn"の様なディレクトリに存在するはずです。
パスも通っているはずですから、DOS窓から「BCP」を実行すれば動作するはずです。
(引数無しで実行するとヘルプが表示されます。以下を参照) 各種の引数があって、いろいろな使い方ができますが、私が基本的に使っている方法を記します。
尚、実行はMSSQLがインストールされているサーバ上で実行しています。


■テーブルをテキストファイルに出力する

テスト用のデータベースである「TEST」と、そのDB内のテスト用テーブル「TABLE_A」の内容全てを テキストファイル「table_a.txt」に出力する方法です。
出力結果はテーブルのカラムの区切り記号としてタブ文字が使われます。また、文字コードはShift-JISです。
(尚、実行はCドライブのルートで実行しています。)
最後の引数の「-T」は、Windows認証の指定ですが、SQL Server認証の場合は「-T」の代わりに「-U」「-P」を用います。
================================================================================
-U [ユーザ名] -P [パスワード]
================================================================================


■SQLの結果をテキストファイルに出力する

上記の説明で使用したテーブル「TABLE_A」を対象としたSQL文の結果をテキストファイル「table_b.txt」に出力する方法です。
最初のコマンドの引数と異なるところは、SQL文を指定するところと、処理区分を「queryout」とすることです。 出力結果は、「table_a.txt」とほぼ同じものが出力されます。


■テーブルにテキストファイルをインポートする

上記の説明で使用したテーブル「TABLE_A」にテキストファイル「table_c.txt」の内容をインポートする方法です。
テキストファイルの内容は、インポートされるテーブルの構造と同じである必要があります。
また、キーの重複があればエラーが発生し、全てのインポート処理は破棄されます。

■関連記事
VB.NET:ADO.NETを使用したSQL-ServerのテーブルのCSV出力
BCPコマンドでUnicode文字形式を使用したデータのインポート及びエクスポート(SQL Server)について
ADO.NET での DataReader の入れ子エラー
ADO.NET を使用した SQL-Server へのアクセス・クラス
SQL-Serverの自動採番(IDENTITY値)の取得・リセット
SQL-Serverのストアド・ファンクションではUPDATEなどが実行できない
SQL-Serverのプロシージャ生成のバッチ実行
SQL-Serverの関数・プロシージャのVB.NETでの実行


2012年7月30日 (月)

SQL-Serverのプロシージャ生成のバッチ実行

前回のSQL-Serverの関数およびプロシージャの生成のバッチファイルでの実行方法の忘備録です。

ホストがローカルホストでインスタンス名がSQLEXPRESSでwindows認証の場合、 以下のコマンドを記述したバッチをサーバー上で実行します。
「test.bat」 「-S」:サーバーの接続先
「-i」:入力ファイルの指定
(この例ではバッチファイルとSQLファイルは同じフォルダに在ります。)

バッチの実行結果です。 「ProcTest.sql」を修正しています。 「FuncTest.sql」を修正しています。 データベース名を「TEST」として実行しています。
尚、関数・プロシージャとも内容の変更が有った場合を想定して、DROP命令で最初に削除しています。

■関連記事
VB.NET:ADO.NETを使用したSQL-ServerのテーブルのCSV出力
BCPコマンドでUnicode文字形式を使用したデータのインポート及びエクスポート(SQL Server)について
ADO.NET での DataReader の入れ子エラー
ADO.NET を使用した SQL-Server へのアクセス・クラス
SQL-Serverの自動採番(IDENTITY値)の取得・リセット
SQL-Serverのストアド・ファンクションではUPDATEなどが実行できない
SQL-Serverのユーティリティ(BCPコマンド)を利用したテーブルへのインポート・エキスポート
SQL-Serverの関数・プロシージャのVB.NETでの実行


2012年6月13日 (水)

SQL-Serverの関数・プロシージャのVB.NETでの実行

最近、VB.NETでのSQL-Serverの関数およびプロシージャの実行を久々にやったのでその忘備録です。

先ず、簡単な関数およびプロシージャをSQL-Serverに登録します。
FUNCTION、PROCEDURE共に階乗の計算を行います。VB.NETからの実行例ですので、
結果が桁数を超えるなどの制限は取り敢えず考えていません。
以下がそれぞれの内容です。

VB.NETでの実行は以下の様になります。関数の実行および、プロシージャの実行を別の関数にしてあります。

■関連記事
VB.NET:ADO.NETを使用したSQL-ServerのテーブルのCSV出力
BCPコマンドでUnicode文字形式を使用したデータのインポート及びエクスポート(SQL Server)について
ADO.NET での DataReader の入れ子エラー
ADO.NET を使用した SQL-Server へのアクセス・クラス
SQL-Serverの自動採番(IDENTITY値)の取得・リセット
SQL-Serverのストアド・ファンクションではUPDATEなどが実行できない
SQL-Serverのユーティリティ(BCPコマンド)を利用したテーブルへのインポート・エキスポート
SQL-Serverのプロシージャ生成のバッチ実行