プログラム の記事一覧

前のページ |


--------(--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2013-04-07(Sun)

SQL Server の定義情報を出力

SQL Serverの定義情報を簡単に確認するために、以下のWSHを作成しました。
未確認ですが、SQL Server 2005以降で動作すると思われます。

※実際には出力するテキストの整形や出力対象DBやテーブル選択、またプログラムにコメントも入っていますが、とりあえず出力を単純なCSVに変更しプログラムの肝心の部分のみ掲載しています。

Const ODBC_DSN = "Driver=SQL Server; Server=.\SQLEXPRESS"
Const OUT_FILE = "./SQL.txt"

Dim objCon
Dim objFs
Dim objFile

Call OpenDB()
Call ReadDB()
Call CloseDB()

Sub OpenDB()
Set objCon = WScript.CreateObject("ADODB.Connection")
objCon.Open ODBC_DSN,"",""
Set objFs = WScript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFs.OpenTextFile(OUT_FILE, 2, True)
End Sub

Sub ReadDB()
Set rsDB = WScript.CreateObject("ADODB.Recordset")
strSql = "SELECT name FROM sys.databases WHERE name <> 'master' AND name <> 'tempdb' AND name <> 'model' AND name <> 'msdb'"
rsDB.Open strSql, objCon, 0, 1, 8
Do Until rsDB.EOF
Call ReadTable(rsDB("name"))
rsDB.MoveNext()
Loop
rsDB.Close
End Sub

Sub ReadTable(strDBName)
Set rsTable = WScript.CreateObject("ADODB.Recordset")
strSql = "USE " & strDBName & "; SELECT name, object_id FROM sys.tables"
rsTable.Open strSql, objCon, 0, 1, 8
Do Until rsTable.EOF
objFile.WriteLine "■" & rsTable("name")
Call ReadColumn(strDBName, rsTable("object_id"))
rsTable.MoveNext()
objFile.WriteLine ""
Loop
rsTable.Close
End Sub

Sub ReadColumn(strDBName, strTableID)
Set rsColumn = WScript.CreateObject("ADODB.Recordset")
strSql = "USE " & strDBName & ";"
strSql = strSql & " SELECT c.name ColumnName, t.name TypeName, c.length Length, c.isnullable IsNull, IsNull(d.definition, '') DefaultValue, IsNull(i.keyno, 0) KeyNo FROM syscolumns c"
strSql = strSql & " LEFT JOIN sys.types t ON c.xtype = t.user_type_id"
strSql = strSql & " LEFT JOIN sys.default_constraints d ON d.object_id = c.cdefault"
strSql = strSql & " LEFT JOIN sys.sysindexkeys i ON i.id = " & strTableID & " AND i.indid = 1 AND i.colid = c.colid"
strSql = strSql & " WHERE c.id = " & strTableID
strSql = strSql & " ORDER BY c.colid"
rsColumn.Open strSql, objCon, 0, 1, 8
Do Until rsColumn.EOF
strBuff = rsColumn("ColumnName") & "," & rsColumn("TypeName") & "," & rsColumn("TypeName") & "," & rsColumn("DefaultValue") & "," & rsColumn("IsNull") & "," & rsColumn("KeyNo")
objFile.WriteLine strBuff
rsColumn.MoveNext()
Loop
rsColumn.Close
End Sub

Sub CloseDB()
objCon.Close
objFile.Close
Set objCon = Nothing
Set objFile = Nothing
Set objFs = Nothing
End Sub
2012-10-18(Thu)

robocopyで隠しフォルダができる

robocopyでドライブをコピーするとコピー先のフォルダが表示されないという相談を受けました。

その時のコマンドは以下です(説明用に簡略化しています)
robocopy D:\ E:\backup /mir /xd "$RECYCLE.BIN" "System Volume Information"

D:ドライブのシステムファイル以外を、E:\backupフォルダにコピーしているのですが、コピー終了後に確認するとE:ドライブにbackupフォルダがないということです。
確認してみると、E:ドライブにbackupフォルダは存在しているのですが、隠し属性がついているため表示サれていませんでした。

robocopyではコピー元の属性をそのままコピーするようなのですが、ドライブ自体には隠し属性があるようで、これがコピー先のフォルダにコピーされ、結果コピー先のフォルダが隠しフォルダになるようです。

ドライブからドライブやフォルダからフォルダでは問題ないはずです。
2012-10-05(Fri)

ASP.NET(.NET Framework 3.5)でHTML5のinput type="number"を使いたい。

ASP.NET(.NET Framework 3.5) + JQuery Mobileで、スマホ・タブレット用データベースアプリを作る際に、HTML5で追加されたinput type="number"を使い数字の入力を行うと便利だと思い、<asp:TextBox>タグにtype="number"
と書いてみたのですが、最終的なHTMLではtype="text"とtype="number"の両方がついており、単純なテキスト入力にしかなりませんでした。

.NET Framework4.0では対応可能なようですが、今回は3.5です。
とりあえず以下の方法で対応を検討中ですが(まだ動作未検証なので動くかどうかも分かりません)、何か他にいい手はないでしょうかね。

<input id="txtNumber" type="number" value="<%=hiddenNumber.Value%>" onblur="hiddenNumber.value = txtNumber.value;" />
<asp:HiddenField ID="hiddenNumber" runat="server" />

※サーバー側では、HiddenFieldにアクセスして値を取得予定です。


ちなみに、input type="number"を使うと、Androidではテンキーボードが表示されましたが、iOSでは何ら変化がありませんでした。
ただ、数字以外は入力できなくなるようなので、それなりに便利のような気がしています。


そもそもASP.NET + JQuery Mobile自体が正しくない選択肢だと思います。
ASP.NET MVCやクライアントサイドAjaxなど、他にいい方法はいくらでもあるはずですが、今回は成り行きで…

ちなみに、私はプログラムに関しては、ほぼ素人です。


[2012.10.10追記]

JQueryの$(".クラス名").attr("type", "number")でinputのtype属性を変更しようとしていたのですが、この方法だと「JavaScript 実行時エラー: type property can't be changed」となりHTML5で拡張されたtypeには変更できなかったのですが、document.getElementById("対象ID").setAttribute("type", "number")では変更可能でした。

ページ中のすべてのinputタグをまとめて変更するために、JQuery Mobileのpagecreateで以下を行ってみましたページロードやpageshowdでも可能かもしれません)。

$("#ページID").live('pagecreate', function () {
var ctls = document.getElementsByTagName("input");
for (var i = 0; i < ctls.length; i++) {
if (ctls[i].className) {
var res = ctls[i].className.match("(?:^|\s)number|date|datetime|datetime-llocal|month|week|time|telephone|tel|email|url|search|range|checkbox|radio|hidden|color(?:$|\s)")
if (res) {
//Type設定
ctls[i].setAttribute("Type", res);
}
}
}
});

typeを変更したいaspテキストボックスのCssClassには変更したいTypeを書きます。
<asp:TextBox ID="TextBox1" CssClass="date" runat="server"></asp:TextBox>

最初はclasslistを使って処理していたのですが、とりあえず古いブラウザを考慮してclassNameに変更しました。
2011-07-28(Thu)

ASP.net WebサイトでクライアントにExcelを返す

ASP.netで作成したWebサイトから、クライアントにExcelを返す処理が必要になりました。
サーバーにExcelをインストールし、CreateObjectで操作する方法もありますが、MSが推奨していないのとExcelのライセンスの問題もあるので、サーバーにExcelをインストールせずにというのが条件です。
どのような方法があるのかを調べながら簡単に確認してみましたので、念のため結果をメモっておきます。

----------------------------------------------------------------------
Crystal Reportでプレビューし、Excelにエクスポートする
----------------------------------------------------------------------
書き出されたExcelのレイアウトがかなり汚いので実用的ではありません。

ちなみに以下のようにすれば、プレビュー表示せずに直接Excel表示も可能です。
Dim rd As New ReportDocument()
With rd
.Load("xxxxxx.rpt")
.SetDataSource(xxxxxx)
.ExportToHttpResponse(ExportFormatType.Excel, Response, True, "xxxxxx")
End With


----------------------------------------------------------------------
普通にaspxでテーブル等を用いてレイアウトを作成し、Page_Loadイベントに以下を追加しクライアントに返す
----------------------------------------------------------------------
Response.Buffer = True
Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader("Content-Disposition", "attachment;filename=xxxxxx.xls")


簡単に出来ますが、ひな形の利用ができないのと、細かな設定も出来ません(こちらのテストでは用紙余白の設定はできましたが、用紙サイズの設定が出来ませんでした)。


----------------------------------------------------------------------
ひな形となるExcelファイルを作成しておき、OLEで編集してクライアントに返す
----------------------------------------------------------------------
ひな形が利用できるのできれいに仕上がるが、ひな形のExcelに行やシートの追加などが出来ません。

'テンプレート取得
Using readStream As New FileStream("xxxxxx.xls", FileMode.Open), reader As New BinaryReader(readStream)
readStream.Position = 0
img = reader.ReadBytes(CInt(readStream.Length))
reader.Close()
End Using
'一時ファイル作成
strTempPath = Path.GetTempFileName
Using writeStream As New FileStream(strTempPath, FileMode.OpenOrCreate), writer As New BinaryWriter(writeStream)
writer.Write(img)
writer.Close()
End Using
'一時ファイルを更新
If Path.GetExtension(strBookPath) = ".xls" Then
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strTempPath & ";" & "Extended Properties=""Excel 8.0;HDR=NO;"""
Else
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & strTempPath & ";" & "Extended Properties=""Excel 12.0;HDR=NO;"""
End If
Dim factory As DbProviderFactory = DbProviderFactories.GetFactory("System.Data.OleDb")
Using connection As DbConnection = factory.CreateConnection()
connection.ConnectionString = strConnection
connection.Open()
Using command As DbCommand = connection.CreateCommand()
       ・
       ・
       ・セルの値を更新する
       ・command.CommandText = "UPDATE [Sheet1$I2:I2] SET F1='セルの値'"
       ・
       ・
End Using
connection.Close()
End Using

'一時ファイルを返す
Using readStream As New System.IO.FileStream(strTempPath, IO.FileMode.Open), reader As New System.IO.BinaryReader(readStream)
readStream.Position = 0
Response.AddHeader("Content-Type", "application/vnd.ms-excel")
Response.AddHeader("Content-Disposition", "attachment;filename=xxxxxx.xls")
Response.BinaryWrite(reader.ReadBytes(CInt(readStream.Length)))
reader.Close()
End Using

'一時ファイルを削除
File.Delete(strTempPath)

'レスポンス終了
Response.End()



----------------------------------------------------------------------
ひな形となるExcelスプレッド形式ファイルを作成しておき、XMLとして編集してクライアントに返す(ひな形なしで新規作成も可能)
----------------------------------------------------------------------
ほぼ思い通りの動作ですが、Excelスプレッド形式の拡張子がxmlのため、クライアントがxmlを他のアプリケーションに関連付けているとExcelで開きません。
拡張子をxlsで返すことも可能ですが、Excel2007以降ではファイルの形式が拡張子が示す形式と異なるという警告がでます。
また、xmlの編集部分のコードがかなり複雑になってしまいます。

xml.Load("xxxxxx.xlm")

・xmlの編集を行う

Response.AddHeader("Content-Type", "application/vnd.ms-excel")
Response.AddHeader("Content-Disposition", "attachment;filename=xxxxxx.xls")
xml.Save(Response.OutputStream)
Response.End()



----------------------------------------------------------------------
ひな形となるExcelファイルを作成しておき、Excel Creatorで編集してクライアントに返す(ひな形なしで新規作成も可能)
----------------------------------------------------------------------
ほぼ何でもできますが、開発用にExcel Creatorの購入と、Webサーバーでの実行用ライセンスが必要となります。
ほぼ同じコードでPDFをクライアントに返すこともできます。


----------------------------------------------------------------------
全般的な注意
----------------------------------------------------------------------
※Excel2010ではクライアントで発行元の警告が出ますが、以下の設定を変更すれば回避出来ます。
Excel2010のセキュリティセンターの[保護されたビュー]で、以下のチェックをオフにする。
・インターネットから取得したファイルに対して、保護されたビューを有効にする
・安全でない可能性のある場所のファイルに対して、保護されたビューを有効にする
2011-06-14(Tue)

ASP.NET 3.5 ListViewコントロールのページあたり行数指定

ASP.NET 3.5から追加されたListViewコントロールをよく使うのですが、いつも疑問に思っていることがありました。
ページャーを追加しなければ多くのデータが表示できるのですが、ブラウザのスクロールが必要になる場合があります。
しかしページャーを付けた場合の1ページの行数の指定方法が分かりませんでしたが、ふと気付いたので書き留めておきます。

デザイン画面からではなくソース表示画面でタグに、PageSize=行数 と書くといいようです。
具体的には以下のようなソースになります。

<LayoutTemplate>
  <tr runat="server">
    <td runat="server">
      <asp:DataPager ID="DataPager1" PageSize="20" runat="server">


こうすると、ページあたり20行が表示されるListViewになります。
2010-01-29(Fri)

拡張子.vbsのファイルを実行すると、コマンドプロンプトが一緒に起動してしまう。

以下のようなメッセージボックスを表示するだけのVBSファイルを作成します。
メモ帳(VBスクリプト)

ところが実行すると、なぜかコマンドプロンプトが一緒に起動してしまいます。
VBスクリプト実行結果(異常)

既定のスクリプトホストがcscriptに設定されているとこのような動作になりますので、cscript //h:wscriptコマンドで既定のスクリプトホストをwscriptに変更します。
コマンドプロンプト(cscript //h:wscript)

正常にメッセージボックスだけが表示されるようになりました。
VBスクリプト実行結果(正常)



 
プロフィール
Author:OMEGAT
FC2ブログへようこそ!
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
FC2カウンター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
忍者AdMax
検索フォーム
カテゴリ
ブロとも申請フォーム

この人とブロともになる

amazonお奨め商品



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。