▼質問
ODBCの設定でOracle(オラクル)に接続しようとすると下記のエラーで接続できないんだ。
接続できませんでした。SQLState=IM004
[Microsoft][ODBC Driver Manager] SQL_HANDLE_ENVでのドライバの SQLAllocHandle は失敗しました。
どうしてなんだ?
▼回答
ODP.NETをインストールしたことはないかい?
それをインストールするとODBCに接続できなくなることがあるんだ。
原因は、Oracle Homeの優先順位が変わるからなんだ。
対策方法の手順は下記の通りだ。
1.「Oracle - OraDb10g_home1」→「Oracle Installation Products」→「Universal Installer」を
起動する。
2.「インストールされた製品(P)...」をクリックする。→「インベントリ」ダイアログが表示される。
3.「環境(E)」タブをクリックする。
4.「ODACHome1」より「OraClient10g_home1」の順位が上位になるように「↑」「↓」ボタンで
変更する。
5.「適用(A)」→「閉じる(C)」ボタンの順にボタンをクリックして終了。
■参考サイト
yukotan hour: 6月 2007
http://yukotan.blogspot.com/2007_06_01_archive.html
木曜日, 10月 11, 2007
日曜日, 10月 07, 2007
[VBA]R1C1形式とA1形式
▼質問
R1C1形式をを英文字のA1形式に変換するにはどうしたらいいの?
▼回答
アクティブセルのR1C1形式・A1形式を取得するサンプルを教えておくよ。
Dim strRowCol As String
Dim strTXlA1 As String
Dim strTXlR1C1 As String
Dim strFXlA1 As String
Dim strFXlR1C1 As String
'1:1
strRowCol = Excel.ActiveCell.Row & ":" & Excel.ActiveCell.Column
'$A$1
strTXlA1 = Excel.ActiveCell.Address(True, True, Excel.XlReferenceStyle.xlA1)
'R1C1
strTXlR1C1 = Excel.ActiveCell.Address(True, True, Excel.XlReferenceStyle.xlR1C1)
'A1
strFXlA1 = Excel.ActiveCell.Address(False, False, Excel.XlReferenceStyle.xlA1)
'R[1]C[1]
strFXlR1C1 = Excel.ActiveCell.Address(False, False, Excel.XlReferenceStyle.xlR1C1)
'A$1
Debug.Print Excel.ActiveCell.Address(True, False, Excel.XlReferenceStyle.xlA1)
'R1C[1]
Debug.Print Excel.ActiveCell.Address(True, False, Excel.XlReferenceStyle.xlR1C1)
'$A1
Debug.Print Excel.ActiveCell.Address(False, True, Excel.XlReferenceStyle.xlA1)
'R[1]C1
Debug.Print Excel.ActiveCell.Address(False, True, Excel.XlReferenceStyle.xlR1C1)
R1C1形式をを英文字のA1形式に変換するにはどうしたらいいの?
▼回答
アクティブセルのR1C1形式・A1形式を取得するサンプルを教えておくよ。
Dim strRowCol As String
Dim strTXlA1 As String
Dim strTXlR1C1 As String
Dim strFXlA1 As String
Dim strFXlR1C1 As String
'1:1
strRowCol = Excel.ActiveCell.Row & ":" & Excel.ActiveCell.Column
'$A$1
strTXlA1 = Excel.ActiveCell.Address(True, True, Excel.XlReferenceStyle.xlA1)
'R1C1
strTXlR1C1 = Excel.ActiveCell.Address(True, True, Excel.XlReferenceStyle.xlR1C1)
'A1
strFXlA1 = Excel.ActiveCell.Address(False, False, Excel.XlReferenceStyle.xlA1)
'R[1]C[1]
strFXlR1C1 = Excel.ActiveCell.Address(False, False, Excel.XlReferenceStyle.xlR1C1)
'A$1
Debug.Print Excel.ActiveCell.Address(True, False, Excel.XlReferenceStyle.xlA1)
'R1C[1]
Debug.Print Excel.ActiveCell.Address(True, False, Excel.XlReferenceStyle.xlR1C1)
'$A1
Debug.Print Excel.ActiveCell.Address(False, True, Excel.XlReferenceStyle.xlA1)
'R[1]C1
Debug.Print Excel.ActiveCell.Address(False, True, Excel.XlReferenceStyle.xlR1C1)
水曜日, 9月 26, 2007
スクリプト
■参考サイト
【Microsoft TechNet: スクリプト センター】
http://www.microsoft.com/japan/technet/scriptcenter/scripts/default.mspx
【Microsoft TechNet: スクリプト センター】
http://www.microsoft.com/japan/technet/scriptcenter/scripts/default.mspx
右クリック(コンテクストメニュー)
■参考サイト
【WEBプログラミング NOW!: IE7β2(日本語版)とGoogle検索】
http://shimax.cocolog-nifty.com/search/2006/05/ie72google_ce28.html
【【JavaScript】外部プログラム実行できますか? IEの選択文字列を、Perlスクリプトに渡したい http://www.hatena.ne.jp/1131762882 という質問をしたら、JavaScriptででき.. - 人力検索はてな】
http://q.hatena.ne.jp/1131779952
【WEBプログラミング NOW!: IE7β2(日本語版)とGoogle検索】
http://shimax.cocolog-nifty.com/search/2006/05/ie72google_ce28.html
【【JavaScript】外部プログラム実行できますか? IEの選択文字列を、Perlスクリプトに渡したい http://www.hatena.ne.jp/1131762882 という質問をしたら、JavaScriptででき.. - 人力検索はてな】
http://q.hatena.ne.jp/1131779952
日曜日, 9月 23, 2007
[VBA]月の日数
▼質問
月の日数をを知りたいんだけど・・・。どうしたらできるの?
▼回答
次の関数で取得することができるよ。
Public Function DaysInMonth(ByVal day As Date) As Integer
Dim NextMonth As Variant
Dim EndOfMonth As Variant
NextMonth = DateAdd("m", 1, day)
EndOfMonth = NextMonth - DatePart("d", NextMonth)
DaysInMonth = DatePart("d", EndOfMonth)
End Function
■参考
[AC97]指定された月の日数を取得する方法
http://support.microsoft.com/kb/109703/ja
月の日数をを知りたいんだけど・・・。どうしたらできるの?
▼回答
次の関数で取得することができるよ。
Public Function DaysInMonth(ByVal day As Date) As Integer
Dim NextMonth As Variant
Dim EndOfMonth As Variant
NextMonth = DateAdd("m", 1, day)
EndOfMonth = NextMonth - DatePart("d", NextMonth)
DaysInMonth = DatePart("d", EndOfMonth)
End Function
■参考
[AC97]指定された月の日数を取得する方法
http://support.microsoft.com/kb/109703/ja
金曜日, 9月 21, 2007
[VBA]印刷関連
▼質問
改ページ数を知りたいんだけど、どうしたらできるの?
▼回答
次のコードで取得できるよ。①が横方向の改ページ数で、②が縦方向だよ。
①Worksheets(シート名).VPageBreaks.Count
②Worksheets(シート名).HPageBreaks.Count
▼質問
改ページを削除するにはどうすればいいの?
▼回答
下記のコードを記述すればできるよ。
Worksheets(シート名).ResetAllPageBreaks
垂直方向の改ページを無くすには下記のコードを記述すると自動で行うことができる。
Worksheets(シート名).ResetAllPageBreaks
Worksheets(シート名).PageSetup.PrintArea = "A1:P" & Worksheets(シート名).range("A65536").End(xlUp).row
If (Worksheets(シート名).VPageBreaks.Count > 0) Then
ActiveWindow.View = xlPageBreakPreview
ActiveSheet.VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1
ActiveWindow.View = xlNormalView
End If
ActiveWindow.LargeScroll Down:=-(Worksheets(シート名).HPageBreaks.Count + 1)
■参考
【Shun's Page】印 刷
http://t_shun.at.infoseek.co.jp/My_Page/Excel-VBA/vba_page20.htm
改ページ数を知りたいんだけど、どうしたらできるの?
▼回答
次のコードで取得できるよ。①が横方向の改ページ数で、②が縦方向だよ。
①Worksheets(シート名).VPageBreaks.Count
②Worksheets(シート名).HPageBreaks.Count
▼質問
改ページを削除するにはどうすればいいの?
▼回答
下記のコードを記述すればできるよ。
Worksheets(シート名).ResetAllPageBreaks
垂直方向の改ページを無くすには下記のコードを記述すると自動で行うことができる。
Worksheets(シート名).ResetAllPageBreaks
Worksheets(シート名).PageSetup.PrintArea = "A1:P" & Worksheets(シート名).range("A65536").End(xlUp).row
If (Worksheets(シート名).VPageBreaks.Count > 0) Then
ActiveWindow.View = xlPageBreakPreview
ActiveSheet.VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1
ActiveWindow.View = xlNormalView
End If
ActiveWindow.LargeScroll Down:=-(Worksheets(シート名).HPageBreaks.Count + 1)
■参考
【Shun's Page】印 刷
http://t_shun.at.infoseek.co.jp/My_Page/Excel-VBA/vba_page20.htm
水曜日, 9月 19, 2007
[VBA]数値入力制限
▼質問
テキストボックスで数値だけを入力できるようにしたいんだ。どうすればいい?
▼回答
KeyPressイベントで下記の関数を呼べばできるよ。
Public Sub KeyNumericOnly(ByRef KeyAscii As ReturnInteger)
'数値キーをチェックする.
If (Not Chr(KeyAscii) Like "[0-9]") Then KeyAscii = 0
End Sub
これだけじゃ駄目だった!
日本語入力ができちゃうー!!
IMEを使えないようにするにはどうしたらいいのか調べることに・・・。
テキストボックスのプロパティIMEModeをfmIMEModeDisableにすれば良いみたい。(^^)v
このやり方のほかに次のコードでも良いみたい。
TextBox1.IMEMode = fmIMEModeDisable
00=fmIMEModeNoControl:IME のモードを変更しません (既定値)。
01=fmIMEModeOn:IME をオンにします。
02=fmIMEModeOff:IME をオフにして英語モードにします。
03=fmIMEModeDisable:IME をオフにします。このモードにするとユーザーは、キー操作によっても IME をオンにすることができなくなります。
04=fmIMEModeHiragana:全角ひらがなモードで IME をオンにします。
05=fmIMEModeKatakana:全角カタカナ モードで IME をオンにします。
06=fmIMEModeKatakanaHalf:半角カタカナ モードで IME をオンにします。
07=fmIMEModeAlphaFull:全角英数モードで IME をオンにします。
08=fmIMEModeAlpha:半角英数モードで IME をオンにします。
09=fmIMEModeHangulFull:全角ハングル モードで IME をオンにします。
10=fmIMEModeHangul:半角ハングル モードで IME をオンにします
■参考
テキストボックスで数値のみを受け取る方法
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/NumericEdit/
テキストボックスで数値だけを入力できるようにしたいんだ。どうすればいい?
▼回答
KeyPressイベントで下記の関数を呼べばできるよ。
Public Sub KeyNumericOnly(ByRef KeyAscii As ReturnInteger)
'数値キーをチェックする.
If (Not Chr(KeyAscii) Like "[0-9]") Then KeyAscii = 0
End Sub
これだけじゃ駄目だった!
日本語入力ができちゃうー!!
IMEを使えないようにするにはどうしたらいいのか調べることに・・・。
テキストボックスのプロパティIMEModeをfmIMEModeDisableにすれば良いみたい。(^^)v
このやり方のほかに次のコードでも良いみたい。
TextBox1.IMEMode = fmIMEModeDisable
00=fmIMEModeNoControl:IME のモードを変更しません (既定値)。
01=fmIMEModeOn:IME をオンにします。
02=fmIMEModeOff:IME をオフにして英語モードにします。
03=fmIMEModeDisable:IME をオフにします。このモードにするとユーザーは、キー操作によっても IME をオンにすることができなくなります。
04=fmIMEModeHiragana:全角ひらがなモードで IME をオンにします。
05=fmIMEModeKatakana:全角カタカナ モードで IME をオンにします。
06=fmIMEModeKatakanaHalf:半角カタカナ モードで IME をオンにします。
07=fmIMEModeAlphaFull:全角英数モードで IME をオンにします。
08=fmIMEModeAlpha:半角英数モードで IME をオンにします。
09=fmIMEModeHangulFull:全角ハングル モードで IME をオンにします。
10=fmIMEModeHangul:半角ハングル モードで IME をオンにします
■参考
テキストボックスで数値のみを受け取る方法
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/NumericEdit/
[VBA]有効な行数を取得する
▼質問
有効な行数を取得するにはどうしたらいいの?
▼回答
A列の終端セル行を取得するには、下記のようにすると取得できる。
Worksheets(シート名).Range("A65536").End(xlUp).Row
この方法では、A列の65536行目から上(xlUp)に終端セルを検索している。
下記のように、上から検索する方法もある。
Worksheets(シート名).Range("A1").End(xlDown).Row
この場合では、途中に空白があるとそこが終端セルと判断してしまうので本当の
終端セルを取得したい場合は、前者の方法を使用した方が良い。
空白が途中に絶対無いとわかっていれば問題はないと思うが・・・。
■参考
Worksheets(シート名).Range("A1").End(direction)
directionは検索の方向を指定する。
xlToLeft:左へ検索
xlToRight:右へ検索
xlUp:上へ検索
xlDown:下へ検索
有効な行数を取得するにはどうしたらいいの?
▼回答
A列の終端セル行を取得するには、下記のようにすると取得できる。
Worksheets(シート名).Range("A65536").End(xlUp).Row
この方法では、A列の65536行目から上(xlUp)に終端セルを検索している。
下記のように、上から検索する方法もある。
Worksheets(シート名).Range("A1").End(xlDown).Row
この場合では、途中に空白があるとそこが終端セルと判断してしまうので本当の
終端セルを取得したい場合は、前者の方法を使用した方が良い。
空白が途中に絶対無いとわかっていれば問題はないと思うが・・・。
■参考
Worksheets(シート名).Range("A1").End(direction)
directionは検索の方向を指定する。
xlToLeft:左へ検索
xlToRight:右へ検索
xlUp:上へ検索
xlDown:下へ検索
日曜日, 9月 16, 2007
[VBA]オブジェクト名でプロパティにアクセスする
▼質問
オブジェクト名でメソッドやプロパティにアクセスしたいんだけどできるの?
▼回答
できるよ!オブジェクト名で設定取得が可能だ。
Me.Controls.Item(オブジェクト名).メソッド名又はプロパティ名
オブジェクト名でメソッドやプロパティにアクセスしたいんだけどできるの?
▼回答
できるよ!オブジェクト名で設定取得が可能だ。
Me.Controls.Item(オブジェクト名).メソッド名又はプロパティ名
木曜日, 9月 06, 2007
[VBA]時刻の設定
▼質問
Date型の変数に時刻を設定するにはどうしたらいいの?
▼回答
Dim NowDate As Date
Dim MakeDate As Date
Dim strDate As String
NowDate = Now
strDate = Format(NowDate, "yyyy") & "/" & _
Format(NowDate, "mm") & "/" & _
Format(NowDate, "dd")
MakeDate = CDate(strDate)
MakeDate = DateTime.DateAdd("h", 24, MakeDate)
MsgBox Format(MakeDate, "yyyy/mm/dd hh:nn:ss")
MakeDate = DateTime.DateAdd("h", 1, MakeDate)
MsgBox Format(MakeDate, "yyyy/mm/dd hh:nn:ss")
Date型の変数に時刻を設定するにはどうしたらいいの?
▼回答
Dim NowDate As Date
Dim MakeDate As Date
Dim strDate As String
NowDate = Now
strDate = Format(NowDate, "yyyy") & "/" & _
Format(NowDate, "mm") & "/" & _
Format(NowDate, "dd")
MakeDate = CDate(strDate)
MakeDate = DateTime.DateAdd("h", 24, MakeDate)
MsgBox Format(MakeDate, "yyyy/mm/dd hh:nn:ss")
MakeDate = DateTime.DateAdd("h", 1, MakeDate)
MsgBox Format(MakeDate, "yyyy/mm/dd hh:nn:ss")
金曜日, 8月 31, 2007
[EXCEL]アドイン
▼質問
Excelでアドインを作るにはどうしたらいいのかな?
▼回答
保存の時に「Microsoft Excel アドイン (*.xla)」を選択して保存するだけだよ。
§Excelのアドインソフトの作り方
http://members.at.infoseek.co.jp/kenchan_h/index15.html
@IT:Windows TIPS -- Tips:Excelでユーザー定義関数をアドインとして提供する
http://www.atmarkit.co.jp/fwin2k/win2ktips/471funcadin/funcadin.html
▼質問
プロパティウィンドウ(ショートカットメニュー・右クリックメニュー・メニューバー)に項目を追加するには
どうしたらいいの?
▼回答
次のプログラムをワークブックオープンのWorkbook_Open()で呼べば追加できるよ。
Dim Obj As Object
Set Obj = Application.CommandBars("Cell").Controls.Add()
With Obj
.Caption = "コマンド表示名称"
.OnAction = "プログラム名"
.BeginGroup = False ' セパレータ追加表示(True:追加表示、False:追加無し)
End With
追加したものはワークブッククローズのWorkbook_BeforeClose(Cancel As Boolean)で削除すること
が必要だよ。
Application.CommandBars("Cell").Controls("コマンド表示名称").Delete
やってみたがうまくいかなかった。(T_T)アドインファイルにするとWorkbook_BeforeCloseは呼ばれ
ないことが判明。
そこで、次のクラスファイルを作成してExcelが閉じられた時に呼ぶようにやってみた。
Option Explicit
Public WithEvents App As Application
Public WithEvents Wb As Workbook
' クラスモジュールの初期化処理(Workbook_Openで呼出すが、Bookを呼出した後でないとダメ)
Public Sub Class_Initialize()
Set App = Application
Set Wb = Application.ActiveWorkbook
End Sub
' クラス内Applicationのワークブッククローズ処理(Excel終了時に呼出される)
Private Sub App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
On Error Resume Next
Application.CommandBars("Cell").Controls("コマンド表示名称").Delete
End Sub
' クラス内Workbookのワークブッククローズ処理(Book終了時に呼出される)
Private Sub Wb_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.CommandBars("Cell").Controls("コマンド表示名称").Delete
Application.DisplayAlerts = True
End Sub
標準モジュールでクラスの生成が必要
Public myApp As New クラス名
■参考サイト
Excel のメニューおよびメニュー バーをカスタマイズする方法
http://support.microsoft.com/kb/830502/ja
Office TANAKA - VBA Tips
http://officetanaka.net/excel/vba/tips/index.htm
Excelでアドインを作るにはどうしたらいいのかな?
▼回答
保存の時に「Microsoft Excel アドイン (*.xla)」を選択して保存するだけだよ。
§Excelのアドインソフトの作り方
http://members.at.infoseek.co.jp/kenchan_h/index15.html
@IT:Windows TIPS -- Tips:Excelでユーザー定義関数をアドインとして提供する
http://www.atmarkit.co.jp/fwin2k/win2ktips/471funcadin/funcadin.html
▼質問
プロパティウィンドウ(ショートカットメニュー・右クリックメニュー・メニューバー)に項目を追加するには
どうしたらいいの?
▼回答
次のプログラムをワークブックオープンのWorkbook_Open()で呼べば追加できるよ。
Dim Obj As Object
Set Obj = Application.CommandBars("Cell").Controls.Add()
With Obj
.Caption = "コマンド表示名称"
.OnAction = "プログラム名"
.BeginGroup = False ' セパレータ追加表示(True:追加表示、False:追加無し)
End With
追加したものはワークブッククローズのWorkbook_BeforeClose(Cancel As Boolean)で削除すること
が必要だよ。
Application.CommandBars("Cell").Controls("コマンド表示名称").Delete
やってみたがうまくいかなかった。(T_T)アドインファイルにするとWorkbook_BeforeCloseは呼ばれ
ないことが判明。
そこで、次のクラスファイルを作成してExcelが閉じられた時に呼ぶようにやってみた。
Option Explicit
Public WithEvents App As Application
Public WithEvents Wb As Workbook
' クラスモジュールの初期化処理(Workbook_Openで呼出すが、Bookを呼出した後でないとダメ)
Public Sub Class_Initialize()
Set App = Application
Set Wb = Application.ActiveWorkbook
End Sub
' クラス内Applicationのワークブッククローズ処理(Excel終了時に呼出される)
Private Sub App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
On Error Resume Next
Application.CommandBars("Cell").Controls("コマンド表示名称").Delete
End Sub
' クラス内Workbookのワークブッククローズ処理(Book終了時に呼出される)
Private Sub Wb_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.CommandBars("Cell").Controls("コマンド表示名称").Delete
Application.DisplayAlerts = True
End Sub
標準モジュールでクラスの生成が必要
Public myApp As New クラス名
■参考サイト
Excel のメニューおよびメニュー バーをカスタマイズする方法
http://support.microsoft.com/kb/830502/ja
Office TANAKA - VBA Tips
http://officetanaka.net/excel/vba/tips/index.htm
木曜日, 7月 12, 2007
[HTML]ラジオボタンとタイトルの連動
▼質問
ラジオボタンのタイトルをクリックした時にタイトルと一緒にラジオボタンを連動させる にはどうしたらよいの?
▼回答
タイトルをラベルタグで囲って、ラジオ(input)ボタンのid属性とラベル( label )タグの for 属性を一緒
の名称にすれば実現することができるよ。
<input type="radio" id="opt_1" name="opt" value="1" checked>
ラジオボタンのタイトルをクリックした時にタイトルと一緒にラジオボタンを連動させる にはどうしたらよいの?
▼回答
タイトルをラベルタグで囲って、ラジオ(input)ボタンのid属性とラベル( label )タグの for 属性を一緒
の名称にすれば実現することができるよ。
<input type="radio" id="opt_1" name="opt" value="1" checked>
火曜日, 7月 03, 2007
[ORACLE]データベース・リンク
▼質問
データベースリンクって何?
▼回答
データベースリンクとは、他のマシンのOracleデータベースを自分のマシンにマッピングする機能。
■参考サイト
Oracle・Tips集
http://ash.jp/db/ora_tips.htm
ORACLE(テクニック)
http://www.geocities.jp/principal_focuses/tech/ora/ora_tech/index.html
データベースリンクって何?
▼回答
データベースリンクとは、他のマシンのOracleデータベースを自分のマシンにマッピングする機能。
■参考サイト
Oracle・Tips集
http://ash.jp/db/ora_tips.htm
ORACLE(テクニック)
http://www.geocities.jp/principal_focuses/tech/ora/ora_tech/index.html
日曜日, 6月 10, 2007
[ORACLE]プロシージャ
▼質問
クライアントからサーバの処理を実行したいんだけど・・・。プロシージャで、できないのかな?
▼回答
実行ファイルが処理できるDLL(Windows)かSO(Unix)を作成して外部プロシージャに
定義(ライブラリ登録?)すれば実現できるよ!
自作しなくてもWindowsAPIを呼ぶことができるからいろいろできそうである。
下記のサイトにINIファイルのAPIを呼ぶサンプルがあったので実験してみた。
いっしーのプログラムヒント集
http://www.j-real.com/stone/progtips.html#Ora2
コピペしたらうまくいかなかったのでうまくいったものを下記に示しておきます。
←こんなエラーが出た!「PLS-00103: 記号"SHOW"が見つかりました」
SQL*Plusに「SYSTE]でログインして実行する。
ここから-------------------------------------------------------------------------------->
-- DLLファイルの名称定義 ディレクトリは環境によって変えてください
create or replace library kernel32 is 'c:\windows\system32\kernel32.dll';
/
show errors;
-- APIのGetPrivateProfileIntA(Iniファイルから数値を取り出す)
create or replace function GetIniInt(
lpApplicationName CHAR,
lpKeyName CHAR,
nDefault BINARY_INTEGER,
lpFileName CHAR
) RETURN BINARY_INTEGER AS
EXTERNAL
LIBRARY kernel32 NAME "GetPrivateProfileIntA"
LANGUAGE C
CALLING STANDARD C;
/
show errors;
-- APIのGetPrivateProfileStringA(Iniファイルから文字列を取り出す)
create or replace function GetIniString( --この関数名は好きなものを付けられます
lpApplicationName String,
lpKeyName String,
lpDefault String,
lpReturnedString OUT String,
nSize BINARY_INTEGER,
lpFileName String
) RETURN BINARY_INTEGER AS
EXTERNAL
LIBRARY kernel32
NAME "GetPrivateProfileStringA"
LANGUAGE C
CALLING STANDARD C;
/
show errors;
<--------------------------------------------------------------------------------ここまで SQL*Plusの実行結果 SQL> @C:\Work\プロシージャ\CRE_SP_INI.sql
ライブラリが作成されました。
エラーはありません。
ファンクションが作成されました。
エラーはありません。
ファンクションが作成されました。
エラーはありません。
SQL>
プロシージャの作成
名前:SP_INI_TEST
ソース
ここから-------------------------------------------------------------------------------->
(
dat in out varchar2,
ret out int
) as
begin
ret := GetIniInt('intl','iCountry', 0, 'c:\windows\win.ini');
dbms_output.put_line(ret);
ret := GetIniString('intl','sCountry', 'Default', dat, 255, 'c:\windows\win.ini'); dbms_output.put_line(dat ' ' ret);
end;
<--------------------------------------------------------------------------------ここまで SQL*Plusの実行方法 SQL> variable dat varchar2(255)
SQL> variable ret NUMBER
SQL> execute SP_INI_TEST( :dat, :ret )
こんなエラーが出た!
「ORA-28595: Extprocエージェント : DLLパスが無効です」
Oracle Net Servicesの拡張機能の使用
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19208-02/advcfg.htm
上記の「表 13-5 listener.oraファイルの外部プロシージャ設定」を読むとリスナーの設定が
必要のようだ。
「Net Manager」→「リスナー」→「LISTENER」→「その他のサービス」→「環境」
"EXTPROC_DLLS=ANY"
うまくいかん!
行番号 = 1 列番号 = 32 エラー・テキスト = PLS-00103: 記号"BEGIN"が見つかりました。 次のうちの1つが入るとき: ( ; is with authid as cluster compress order using compiled wrapped external deterministic parallel_enable pipelined
■参考サイト 外部プロシージャのコール http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19248-02/adfns_extern_proc.htm
OKLab - Oracle PL/SQL入門
http://www.oklab.org/oracle/plsql.xhtml
クライアントからサーバの処理を実行したいんだけど・・・。プロシージャで、できないのかな?
▼回答
実行ファイルが処理できるDLL(Windows)かSO(Unix)を作成して外部プロシージャに
定義(ライブラリ登録?)すれば実現できるよ!
自作しなくてもWindowsAPIを呼ぶことができるからいろいろできそうである。
下記のサイトにINIファイルのAPIを呼ぶサンプルがあったので実験してみた。
いっしーのプログラムヒント集
http://www.j-real.com/stone/progtips.html#Ora2
コピペしたらうまくいかなかったのでうまくいったものを下記に示しておきます。
←こんなエラーが出た!「PLS-00103: 記号"SHOW"が見つかりました」
SQL*Plusに「SYSTE]でログインして実行する。
ここから-------------------------------------------------------------------------------->
-- DLLファイルの名称定義 ディレクトリは環境によって変えてください
create or replace library kernel32 is 'c:\windows\system32\kernel32.dll';
/
show errors;
-- APIのGetPrivateProfileIntA(Iniファイルから数値を取り出す)
create or replace function GetIniInt(
lpApplicationName CHAR,
lpKeyName CHAR,
nDefault BINARY_INTEGER,
lpFileName CHAR
) RETURN BINARY_INTEGER AS
EXTERNAL
LIBRARY kernel32 NAME "GetPrivateProfileIntA"
LANGUAGE C
CALLING STANDARD C;
/
show errors;
-- APIのGetPrivateProfileStringA(Iniファイルから文字列を取り出す)
create or replace function GetIniString( --この関数名は好きなものを付けられます
lpApplicationName String,
lpKeyName String,
lpDefault String,
lpReturnedString OUT String,
nSize BINARY_INTEGER,
lpFileName String
) RETURN BINARY_INTEGER AS
EXTERNAL
LIBRARY kernel32
NAME "GetPrivateProfileStringA"
LANGUAGE C
CALLING STANDARD C;
/
show errors;
<--------------------------------------------------------------------------------ここまで SQL*Plusの実行結果 SQL> @C:\Work\プロシージャ\CRE_SP_INI.sql
ライブラリが作成されました。
エラーはありません。
ファンクションが作成されました。
エラーはありません。
ファンクションが作成されました。
エラーはありません。
SQL>
プロシージャの作成
名前:SP_INI_TEST
ソース
ここから-------------------------------------------------------------------------------->
(
dat in out varchar2,
ret out int
) as
begin
ret := GetIniInt('intl','iCountry', 0, 'c:\windows\win.ini');
dbms_output.put_line(ret);
ret := GetIniString('intl','sCountry', 'Default', dat, 255, 'c:\windows\win.ini'); dbms_output.put_line(dat ' ' ret);
end;
<--------------------------------------------------------------------------------ここまで SQL*Plusの実行方法 SQL> variable dat varchar2(255)
SQL> variable ret NUMBER
SQL> execute SP_INI_TEST( :dat, :ret )
こんなエラーが出た!
「ORA-28595: Extprocエージェント : DLLパスが無効です」
Oracle Net Servicesの拡張機能の使用
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19208-02/advcfg.htm
上記の「表 13-5 listener.oraファイルの外部プロシージャ設定」を読むとリスナーの設定が
必要のようだ。
「Net Manager」→「リスナー」→「LISTENER」→「その他のサービス」→「環境」
"EXTPROC_DLLS=ANY"
うまくいかん!
行番号 = 1 列番号 = 32 エラー・テキスト = PLS-00103: 記号"BEGIN"が見つかりました。 次のうちの1つが入るとき: ( ; is with authid as cluster compress order using compiled wrapped external deterministic parallel_enable pipelined
■参考サイト 外部プロシージャのコール http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19248-02/adfns_extern_proc.htm
OKLab - Oracle PL/SQL入門
http://www.oklab.org/oracle/plsql.xhtml
土曜日, 6月 09, 2007
[tool]Windowsでリモートシェル
▼質問
LAN(2重化)の2枚挿しの時にリモートシェルが片方しか実行されない。
▼回答
リモートシェルが起動する時、RSHSVC.EXEは接続されているIPアドレスを優先的に取得し、
2つのLANが正常に接続されている時は、ネットワークの詳細設定で設定されている優先順位
によって決まるようだ。
起動時につながっていたLANに障害が発生した時は、RSHSVC.EXEを再起動しなくては正常な
LANに繋げにいくことはできない。
自動でリモートシェルを切替えるには面倒なようだ。(>_<);
■rshコマンド http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ja/library/ServerHelp/da116a07-36a0-4b8d-885e-eec3b8ed33fe.mspx?mfr=true
■サービス登録方法(SC.EXE)
sc Create RshSvc binPath= "C:\WINDOWS\system32\RSHSVC.EXE" start= auto DisplayName= "Remote Shell Service"
■参考サイト
Windows Services for UNIX
http://www.microsoft.com/japan/technet/interopmigration/unix/sfu/default.mspx
リモートコンソール関係1
http://www.netwave.or.jp/~jun-n/reskit/remote1.htm
Remote Shell Services in SFU
http://technet.microsoft.com/en-us/library/B3877C5F-D844-F417-AD77-992E03F41BA3.aspx
Windowsに対してrshを行う手順
http://www.buk-u.com/rsh/
RSH Daemon - TetraPod
http://www.xvi.jp/item/146
LAN(2重化)の2枚挿しの時にリモートシェルが片方しか実行されない。
▼回答
リモートシェルが起動する時、RSHSVC.EXEは接続されているIPアドレスを優先的に取得し、
2つのLANが正常に接続されている時は、ネットワークの詳細設定で設定されている優先順位
によって決まるようだ。
起動時につながっていたLANに障害が発生した時は、RSHSVC.EXEを再起動しなくては正常な
LANに繋げにいくことはできない。
自動でリモートシェルを切替えるには面倒なようだ。(>_<);
■rshコマンド http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ja/library/ServerHelp/da116a07-36a0-4b8d-885e-eec3b8ed33fe.mspx?mfr=true
■サービス登録方法(SC.EXE)
sc Create RshSvc binPath= "C:\WINDOWS\system32\RSHSVC.EXE" start= auto DisplayName= "Remote Shell Service"
■参考サイト
Windows Services for UNIX
http://www.microsoft.com/japan/technet/interopmigration/unix/sfu/default.mspx
リモートコンソール関係1
http://www.netwave.or.jp/~jun-n/reskit/remote1.htm
Remote Shell Services in SFU
http://technet.microsoft.com/en-us/library/B3877C5F-D844-F417-AD77-992E03F41BA3.aspx
Windowsに対してrshを行う手順
http://www.buk-u.com/rsh/
RSH Daemon - TetraPod
http://www.xvi.jp/item/146
金曜日, 5月 04, 2007
[VC++]ping
▼質問
ビルドしたら下記のエラーが出た。
「error LNK2019: 未解決の外部シンボル _IcmpSendEcho@32 が関数 "unsigned long __cdecl 関数名(unsigned long,int)" (mailto:YAKKH@Z) で参照されました。 オブジェクト名.obj
▼回答
IcmpSendEcho関係をリンクするライブラリがないと思われる。
下記のサイトでIP Helper APIを使うためには、Platform SDKをインストールと書いてあった。
IPHLPAPIを使ってWindowsでネットワーク設定いじるプログラムを書く
http://www.geekpage.jp/programming/iphlpapi/
Windows Platform SDKのインストール方法もこのサイトに説明されていた。感謝!感謝!
Windows Platform SDKのインストール
http://www.geekpage.jp/programming/platform-sdk/
VC++2005なのでこっちの説明の方が良さそうである。
Visual C++ Express Editionを使ってみる(Windows Platform SDK編)
http://freepg.fc2web.com/cpp/topic_vce_001.html
「IPHlpApi.Lib」をリンクした解決した。
■参考サイト
IPHLPAPI(IP Helper API)の使い方 [自作ping]
http://www.geekpage.jp/programming/iphlpapi/send-icmp.php
▼質問
ビルドしたら下記のエラーが出た。
「error LNK2019: 未解決の外部シンボル _inet_addr@4 が関数 "unsigned long __cdecl 関数名(char *,int)" (?関数名@@YAKPADH@Z) で参照されました。 オブジェクト名.obj 」
▼回答
IPアドレスをLong型の数値に変換するinet_addr関数を使用すると「Ws2_32.lib」をリンクしないと
いけないようだ。
ビルドしたら下記のエラーが出た。
「error LNK2019: 未解決の外部シンボル _IcmpSendEcho@32 が関数 "unsigned long __cdecl 関数名(unsigned long,int)" (mailto:YAKKH@Z) で参照されました。 オブジェクト名.obj
▼回答
IcmpSendEcho関係をリンクするライブラリがないと思われる。
下記のサイトでIP Helper APIを使うためには、Platform SDKをインストールと書いてあった。
IPHLPAPIを使ってWindowsでネットワーク設定いじるプログラムを書く
http://www.geekpage.jp/programming/iphlpapi/
Windows Platform SDKのインストール方法もこのサイトに説明されていた。感謝!感謝!
Windows Platform SDKのインストール
http://www.geekpage.jp/programming/platform-sdk/
VC++2005なのでこっちの説明の方が良さそうである。
Visual C++ Express Editionを使ってみる(Windows Platform SDK編)
http://freepg.fc2web.com/cpp/topic_vce_001.html
「IPHlpApi.Lib」をリンクした解決した。
■参考サイト
IPHLPAPI(IP Helper API)の使い方 [自作ping]
http://www.geekpage.jp/programming/iphlpapi/send-icmp.php
▼質問
ビルドしたら下記のエラーが出た。
「error LNK2019: 未解決の外部シンボル _inet_addr@4 が関数 "unsigned long __cdecl 関数名(char *,int)" (?関数名@@YAKPADH@Z) で参照されました。 オブジェクト名.obj 」
▼回答
IPアドレスをLong型の数値に変換するinet_addr関数を使用すると「Ws2_32.lib」をリンクしないと
いけないようだ。
木曜日, 5月 03, 2007
[VC++]文字列
▼質問
wchar_t型からchar型に変換するにはどうしたらいいの?
▼回答
TCHAR * str1 = TEXT("テスト");
TCHAR str2[32];
lstrcpy(str2 , str1);
■参考サイト
方法 : さまざまな文字列型間で変換する
http://msdn2.microsoft.com/ja-jp/library/ms235631(VS.80).aspx
wchar_t型からchar型に変換するにはどうしたらいいの?
▼回答
TCHAR * str1 = TEXT("テスト");
TCHAR str2[32];
lstrcpy(str2 , str1);
■参考サイト
方法 : さまざまな文字列型間で変換する
http://msdn2.microsoft.com/ja-jp/library/ms235631(VS.80).aspx
水曜日, 5月 02, 2007
[VC++]oo4o接続・設定
▼質問
リビルドすると下記のエラーが発生する。
「fatal error C1083: include ファイルを開けません。'oracl.h': No such file or directory ファイルパス 行番号」
▼回答
オラクルがインストールされた下記のパスのどちらかを「構成プロパティ」→「C/C++」→「全般」→
「追加のインクルード ディレクトリ」に追加する。
クライアントインストール:\oracle\product\10.2.0\client_1\oo4o\CPP\INCLUDE
オラクルインストール:\oracle\product\10.2.0\db_1\oo4o\CPP\INCLUDE
▼質問
リビルドで下記のエラーが出る。
「error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: int __thiscall ODynaset::Close(void)" (__imp_?Close@ODynaset@@QAEHXZ) が関数 __catch$_ファイル名@4$0 で参照されました。 オブジェクトファイル名」
▼回答
オラクルがインストールされた下記のパスのどちらかを「構成プロパティ」→「リンカ」→「入力」→
「追加の依存ファイル」に追加する。
クライアントインストール:\oracle\product\10.2.0\client_1\oo4o\CPP\LIB\ORACLM32.LIB
オラクルインストール:\oracle\product\10.2.0\db_1\oo4o\CPP\LIB\ORACLM32.LIB
リビルドすると下記のエラーが発生する。
「fatal error C1083: include ファイルを開けません。'oracl.h': No such file or directory ファイルパス 行番号」
▼回答
オラクルがインストールされた下記のパスのどちらかを「構成プロパティ」→「C/C++」→「全般」→
「追加のインクルード ディレクトリ」に追加する。
クライアントインストール:\oracle\product\10.2.0\client_1\oo4o\CPP\INCLUDE
オラクルインストール:\oracle\product\10.2.0\db_1\oo4o\CPP\INCLUDE
▼質問
リビルドで下記のエラーが出る。
「error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: int __thiscall ODynaset::Close(void)" (__imp_?Close@ODynaset@@QAEHXZ) が関数 __catch$_ファイル名@4$0 で参照されました。 オブジェクトファイル名」
▼回答
オラクルがインストールされた下記のパスのどちらかを「構成プロパティ」→「リンカ」→「入力」→
「追加の依存ファイル」に追加する。
クライアントインストール:\oracle\product\10.2.0\client_1\oo4o\CPP\LIB\ORACLM32.LIB
オラクルインストール:\oracle\product\10.2.0\db_1\oo4o\CPP\LIB\ORACLM32.LIB
[C言語orC++]VC++2005へのバージョンアップ
▼質問
C言語で書かれたソースをVC++2005でリビルドすると下記のエラーが出る。
「警告 1 warning C4996: 'strcpy' が古い形式として宣言されました。 ファイルパス 行番号」
▼回答
VC++2005のランタイムから既存標準関数のセキュリティが持つ脆弱性の対応で
新しい関数が提供されたため。
回避策として次のコードを記述すると無効にできる。
#pragma warning(disable : 4996)
他の回避方法として次の#defineのどちらかを定義すればと書いてあったので
試してみたが警告は消えなかった。なぜ?
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_NO_DEPRECATE 1
理由はわからないがヘッダファイルの「stdafx.h」に記述したら消えたぞ!
記述の場所は、ヘッダーファイルが記述している前にしないといけないみたい。
「_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES」の定義は消えない
警告もあるので「_CRT_SECURE_NO_DEPRECATE」を使った方が良いみたい。(^^)v
プロジェクトのプロパティでも定義できるようなのでそちらも試してみました。
「構成プロパティ」->「C/C++」->「プリプロセッサ」->「プリプロセッサの定義」の
末尾に 追加する。
この他にも下記の関数も変更になったようだ。
従来の関数:セキュアな関数
strcpy:strcpy_s
strncpy:strncpy_s
printf:printf_s
asctime:asctime_s
ctime:ctime_s
■参考サイト
Visual C++ 2005 C/C++ランタイム ライブラリ新機能概要
http://www.microsoft.com/japan/msdn/security/demo/runtime.aspx
CRT のセキュリティ強化
http://msdn2.microsoft.com/ja-jp/library/8ef0s5kh(VS.80).aspx
;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T
▼質問
ライブラリのリンクってどうやってやるの?
▼回答
こんな方法があるよ。
プロジェクトのプロパティでライブラリのファイルを絶対パス(フルパス)で直接設定する方法と
ライブラリファイルとパスを分けて設定する方法があるよ。
前者
「構成プロパティ」->「リンカ」->「入力」->「追加の依存ファイル」に「絶対パス(フルパス)」
を指定する。
後者
「構成プロパティ」->「リンカ」->「入力」->「追加の依存ファイル」にリンクするライブラリ
ファイルを指定して、そのライブラリまでのパスを下記のプロパティに設定する。
「構成プロパティ」->「リンカ」->「全般」->「追加のライブラリ ディレクトリ」
C言語で書かれたソースをVC++2005でリビルドすると下記のエラーが出る。
「警告 1 warning C4996: 'strcpy' が古い形式として宣言されました。 ファイルパス 行番号」
▼回答
VC++2005のランタイムから既存標準関数のセキュリティが持つ脆弱性の対応で
新しい関数が提供されたため。
回避策として次のコードを記述すると無効にできる。
#pragma warning(disable : 4996)
他の回避方法として次の#defineのどちらかを定義すればと書いてあったので
試してみたが警告は消えなかった。なぜ?
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_NO_DEPRECATE 1
理由はわからないがヘッダファイルの「stdafx.h」に記述したら消えたぞ!
記述の場所は、ヘッダーファイルが記述している前にしないといけないみたい。
「_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES」の定義は消えない
警告もあるので「_CRT_SECURE_NO_DEPRECATE」を使った方が良いみたい。(^^)v
プロジェクトのプロパティでも定義できるようなのでそちらも試してみました。
「構成プロパティ」->「C/C++」->「プリプロセッサ」->「プリプロセッサの定義」の
末尾に 追加する。
この他にも下記の関数も変更になったようだ。
従来の関数:セキュアな関数
strcpy:strcpy_s
strncpy:strncpy_s
printf:printf_s
asctime:asctime_s
ctime:ctime_s
■参考サイト
Visual C++ 2005 C/C++ランタイム ライブラリ新機能概要
http://www.microsoft.com/japan/msdn/security/demo/runtime.aspx
CRT のセキュリティ強化
http://msdn2.microsoft.com/ja-jp/library/8ef0s5kh(VS.80).aspx
;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T
▼質問
ライブラリのリンクってどうやってやるの?
▼回答
こんな方法があるよ。
プロジェクトのプロパティでライブラリのファイルを絶対パス(フルパス)で直接設定する方法と
ライブラリファイルとパスを分けて設定する方法があるよ。
前者
「構成プロパティ」->「リンカ」->「入力」->「追加の依存ファイル」に「絶対パス(フルパス)」
を指定する。
後者
「構成プロパティ」->「リンカ」->「入力」->「追加の依存ファイル」にリンクするライブラリ
ファイルを指定して、そのライブラリまでのパスを下記のプロパティに設定する。
「構成プロパティ」->「リンカ」->「全般」->「追加のライブラリ ディレクトリ」
月曜日, 4月 30, 2007
[VC++]Win32API関連
▼質問
HINSTANCEの取得方法ってないの?
▼回答
Win32APIのGetModuleHandle関数を使えば取得できるよ。引数に0を指定すれば自プロセスが
取得できるんだ。
HINSTANCE hinstDLL;
hinstDLL = ::GetModuleHandle(0);
HINSTANCEの取得方法ってないの?
▼回答
Win32APIのGetModuleHandle関数を使えば取得できるよ。引数に0を指定すれば自プロセスが
取得できるんだ。
HINSTANCE hinstDLL;
hinstDLL = ::GetModuleHandle(0);
登録:
投稿 (Atom)