-
最近、VB.NETでのSQL-Serverの関数およびプロシージャの実行をやったのでその忘備録です。
先ず、簡単な関数およびプロシージャをSQL-Serverに登録します。
FUNCTION、PROCEDURE共に階乗の計算を行います。VB.NETからの実行例ですので、 結果が桁数を超えるなどの制限は取り敢えず考えていません。
以下がそれぞれの内容です。
----------------------------------------- -- 階乗を計算する(関数) ----------------------------------------- CREATE FUNCTION [dbo].[FuncTest]( @SrcNumber DECIMAL --引数 ) RETURNS DECIMAL BEGIN DECLARE @DesNumber DECIMAL SET @DesNumber = 1 WHILE @SrcNumber > 0 BEGIN SET @DesNumber = @DesNumber * @SrcNumber SET @SrcNumber = @SrcNumber - 1 END RETURN @DesNumber END ----------------------------------------- -- 階乗を計算する(プロシージャ) ----------------------------------------- CREATE PROCEDURE [dbo].[ProcTest] @SrcNumber DECIMAL --引数 ,@DesNumber DECIMAL OUTPUT --戻り値 AS BEGIN SET @DesNumber = 1 WHILE @SrcNumber > 0 BEGIN SET @DesNumber = @DesNumber * @SrcNumber SET @SrcNumber = @SrcNumber - 1 END END
VB.NETでの実行は以下の様になります。関数の実行および、プロシージャの実行を別の関数にしてあります。'関数の実行 Private Sub TestFunc() 'コネクション・接続文字列 Dim Con As New System.Data.SqlClient.SqlConnection( _ "Data Source=(local)\SQLEXPRESS;" & _ "Initial Catalog=TEST;Integrated Security=SSPI") Try 'コネクションオープン Con.Open() '取得関数SQL Dim SQL As String = "SELECT [dbo].[FuncTest](@SrcNumber)" 'SQLコマンド生成(コネクション指定) Dim sqlCommand As New System.Data.SqlClient.SqlCommand(SQL, Con) 'SQLコマンドへ引数設定 sqlCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@SrcNumber", 10)) 'SQLコマンド実行 Dim obj As Object = sqlCommand.ExecuteScalar Console.Write(CDec(obj)) Finally 'コネクション破棄 If Con.State <> System.Data.ConnectionState.Closed Then Con.Close() Con.Dispose() End If End Try End Sub 'プロシージャの実行 Private Sub TestProc() 'コネクション・接続文字列 Dim Con As New System.Data.SqlClient.SqlConnection( _ "Data Source=(local)\SQLEXPRESS;" & _ "Initial Catalog=TEST;Integrated Security=SSPI") Try 'コネクションオープン Con.Open() '取得関数SQL Dim SQL As String = "[dbo].[ProcTest]" 'SQLコマンド生成 Dim sqlCommand As New System.Data.SqlClient.SqlCommand(SQL, Con) 'ストアド・プロシージャ設定 sqlCommand.CommandType = System.Data.CommandType.StoredProcedure 'SQLコマンドへ第1引数設定(SrcNumber) sqlCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@SrcNumber", 10)) 'SQLコマンドへ第2引数設定(DesNumber:出力指定) Dim prmDesNumber As New System.Data.SqlClient.SqlParameter With prmDesNumber .ParameterName = "@DesNumber" 'パラメータ名 .DbType = Data.DbType.Decimal 'DBのデータ型 .Direction = System.Data.ParameterDirection.Output '出力 .Precision = 18 'DECIMAL(18,0) .Scale = 0 '(小数点以下指定) .Value = 0 '取り敢えず値をクリア End With sqlCommand.Parameters.Add(prmDesNumber) 'プロシージャ実行 sqlCommand.ExecuteNonQuery() '戻り値を表示 Console.Write(prmDesNumber.Value) Finally 'コネクション破棄 If Con.State <> System.Data.ConnectionState.Closed Then Con.Close() Con.Dispose() End If End Try End Sub
=====
2012/06/13:の時の情報
PR -
asp.netアプリをコーディング中に、
「エラー 2 CodeDom プロバイダ型 "Microsoft.VJSharp.VJSharpCodeProvider, VJSharpCodeProvider, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" を読み込めませんでした。」
というエラーが出て、コンパイル不能状態に陥りました。
開発中の自分のディレクトリ内にJavaScript用のフォルダがあり その中にとあるライブラリを入れていたのですが、 その中に拡張子「java」のファイルがあったのが原因でした。
拡張子「java」のファイルを全て、別の拡張子に変更したらうまくいきました。
=====
2011/11/10:の時の情報
-
こんにちは。
昔「おやじプログラマー日記」というブログをやっていたのですが、
ここ数年、更新していなかったので、プロバイダから、削除されてしまいました。
そこで手元に残っている資料をもとに、少し復活していきます。
尚、何分古い情報ですので、参考になるかは、わかりませんが、
誰かの参考になれば幸いです。
-
Promise の使い方して以下の記事を書きましたが、今回は Promise を返す関数を同期的に処理するための async / await の使い方の記事を書いてみます。
⇒JavaScript Promiseの使い方(非同期処理に関連して)
⇒JavaScript Promiseの使い方2(非同期処理に関連して)
あらためて、Promise を使用した関数ですが、以下のものを使用します。■Promise を使用した関数例
// Promise を返す関数の宣言 function test_callback(timeoutval) { return new Promise(function(resolve) { setTimeout(function() { resolve(timeoutval); }, timeoutval); }); }
この関数は setTimeout を使ってタイムアウトした時に resolve で指定された関数を実行します。
それではこの関数を使用してみます。// テスト test_callback(1000).then((data) => { console.log('callback...OK:' + data); }); // test_callback()をCALLした直後にコンソール出力 console.log('test_callback:実行');
これを実行すると以下のものがコンソール出力されます。test_callback:実行 // 先にこのメッセージが表示 callback...OK:1000
2行目のメッセージは test_callback 内のタイムアウトが終わってからの表示となります。 これを逆順で表示させたい場合(ソース上の順番通り)には async / await を使うことになります。
■async / await を使って同期処理を行う
公式サイトには async / await の説明が以下の様にあります。
async function 宣言は非同期関数を宣言し、その中で await キーワードを使うことができます。 async および await キーワードを使用することで、プロミスベースの非同期の動作を、 プロミスチェーンを明示的に構成する必要なく、よりすっきりとした方法で書くことができます。
この説明によれば、非同期関数の宣言には「function」宣言の前に「async」を付けて関数宣言を行い、 Promise ベースの非同期の動作の前に「await」を付けることで、Promise ベースの非同期の動作を待つことができるようです。
上記の実行部分を1個の関数として以下の様に async / await を使って宣言します。async function sample_callback() { // テスト await test_callback(1000).then((data) => { console.log('callback...OK:' + data); }); // test_callback()をCALLした直後にコンソール出力 console.log('test_callback:実行'); }
この関数を実行すると、結果としてコンソールには以下の出力が行われます。
callback...OK:1000 test_callback:実行 // 後からこのメッセージが表示
await で宣言した部分の実行が終わってから、最後のコンソール出力が実行されました。
ここで await の処理を複数行う様にしてみます。async function sample_callback() { // テスト1 await test_callback(1000).then((data) => { console.log('callback...OK:' + data); }); // テスト2 await test_callback(2000).then((data) => { console.log('callback...OK:' + data); }); // テスト3 await test_callback(3000).then((data) => { console.log('callback...OK:' + data); }); // 最後のコンソール出力 console.log('最後のコンソール出力'); }
これを実行すると、以下のコンソール出力が実行されました。
callback...OK:1000 callback...OK:2000 callback...OK:3000 最後のコンソール出力
同期的に順次処理が行われていることが分かります。
今回の例では実際の処理として setTimeout を使ったタイマ待ちで、タイムアウト時の処理を行わせていますが、 実用的な処理においても、いろんな機能のメソッドの処理終了時にコールバック関数を呼ぶものがります。
この場合にも Promise で処理関数を宣言し、それを呼出す関数を async / await で行えば、 同期的に処理が行われるので、ソース的には上から下への流れに記述できると思います。
関連する記事
⇒JavaScript 何に使う
⇒JavaScript jQueryの使い方(セレクタ)
⇒JavaScript jQueryの使い方(セレクタ)その2
⇒JavaScript 関数の宣言について(function)
⇒JavaScript jQueryでJavascriptファイルの動的に変更する方法
⇒JavaScript jQueryを使った checkbox の操作方法
-
Promise の使い方の1回目として以下の記事を書きましたが、エラー処理に付いては書いていませんでしたので、今回追加の記事を書いてみます。
⇒JavaScript Promiseの使い方(非同期処理に関連して)
あらためて、Promise の説明ですが、以下の様になります。■Promise の説明
// Promiseの生成 const Promise = new Promise((resolve, reject) => { // ここで何かの処理 // … if ( [成功]/[失敗]の判定 ) { resolve("OK"); // [成功] } else { reject("NG"); // [失敗] } }); // Promiseの実行 Promise.then((result) => { // 成功時は「resolve」から渡されるものが「result」に返される console.log(result); // "OK"が表示される }) .catch((error) => { // 失敗時は「reject」から渡されるものが「error」に返される console.log(error); // "NG"が表示される });
1回目の記事での例を以下に示します。// コールバック用の関数を再掲 function test_callback2(timeoutval) { return new Promise((resolve) { setTimeout(function() { resolve(timeoutval); // 成功時の関数をコール }, timeoutval); }); }
この関数は setTimeout を使ってタイムアウトした時に resolve で指定された関数を実行します。
setTimeout にはエラー等は発生することは無いのですが、仮に指定されたタイムアウト値が奇数の場合は失敗時とし、 偶数の場合には成功時として関数を書き変えてみます。// コールバック用の関数を再掲 function test_callback2(timeoutval) { return new Promise(function(resolve, reject) { setTimeout(function() { if ((timeoutval & 1) == 0) { resolve(timeoutval); // 成功時の関数をコール } else { reject(timeoutval); // 失敗時の関数をコール } }, timeoutval); }); }
■Promiseを使って失敗時と成功時の処理を追加したもの
test_callback2 は Promiseオブジェクトを返してきますので、成功時の処理を行う為に、then メソッドに関数を記述します。 成功時の戻り値が在る場合は引数を記述します。(以下の例では「data」にあたります)
また、失敗時の処理を行う為に、catch メソッドに関数を記述します。
以下に、実行例を示します。// 成功時のテスト test_callback2(1000).then((data) => { console.log('callback...OK:' + data); }).catch((data) => { // タイムアウト値が偶数なのでここは呼ばれない console.log('callback...NG:' + data); }); // 失敗時のテスト test_callback2(1001).then((data) => { // タイムアウト値が奇数なのでここは呼ばれない console.log('callback...OK:' + data); }).catch((data) => { console.log('callback...NG:' + data); });
結果としてコンソールには以下の出力が行われます。
callback...OK:1000 callback...NG:1001
■実際にエラーが起きる場合の例
上記の例では便宜的に失敗時の処理が発生する様にして例を示しましたが、 以下の例ではエラーが起きるであろう場合の例を記します。
以下の関数は XMLHttpRequest を使用してテキストファイルの取得をします。
XMLHttpRequest のロード後のイベントとして「onload」時の関数を、 レスポンスの HTTP ステータスに従って、成功時と失敗時の関数コールを変えています。
また、エラー時のイベントとして「onload」時の関数を、失敗時の関数コールを行う様にしています。
// XMLHttpRequest を使用してテキストファイルの取得 function getFile(url) { const promise = new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = () => { if (xhr.status == 200) { // レスポンスの HTTP ステータスを解析 resolve(xhr); } else { reject(xhr); } }; xhr.onerror = () => { reject(xhr); }; xhr.send(null); }); return promise; }
これを使用する例を以下に記します。// 最初は存在するテキストファイル getFile('test.txt').then((xhr) => { console.log('test.txt:' + xhr.responseText); }).catch((xhr) => { console.log('test.txt...NG:' + xhr.statusText); }); // 存在しないテキストファイル getFile('aaa.txt').then((xhr) => { console.log('aaa.txt:' + xhr.responseText); }).catch((xhr) => { console.log('aaa.txt...NG:' + xhr.statusText); });
結果として、コンソールに以下のものが出力されます。 (test.txt の内容は”This is test.”の文字列が書かれています)test.txt:This is test. GET http://localhost/__IndexedDB/aaa.txt 404 (Not Found) // ここは2回目の getFile の xhr.send でエラーが発生する aaa.txt...NG:Not Found
関連する記事
⇒JavaScript 何に使う
⇒JavaScript jQueryの使い方(セレクタ)
⇒JavaScript jQueryの使い方(セレクタ)その2
⇒JavaScript 関数の宣言について(function)
⇒JavaScript jQueryでJavascriptファイルの動的に変更する方法
⇒JavaScript jQueryを使った checkbox の操作方法