2010年12月17日金曜日

bcpユーティリティと BULK INSERT

CSVファイルから SQL Serverへのデータ読み込み速度向上のため調べたもの。
結局使わなかったけど。

コマンドプロンプトから、たとえば
 bcp "tablename" IN "C:\csvfilename"
  -c -r\n -t, -q -b1000 -U username -P password

または

 BULK INSERT tablename from "C:\csvfilename"
  (ただし所有者のみ)


※テーブルの列サイズが小さいと「文字列データの右側が切り捨てられました。」とエラーになる。

SQLServerでのテーブル構造とデータ型の取得

ORACLEでは静的ディクショナリ表でテーブル構造を調べることができるのは知っていたけど、SQL Serverではこうやるらしい。

SELECT LEFT(name,30) as colname, xtype, length

FROM syscolumns
WHERE id=( SELECT id FROM sysobjects WHERE name = 'テーブル名')
ORDER BY colid

■ xtype値とデータ型の関係
  52,56:整数型(Long)
  62,106:実数型(Double)
  167:length>255ならメモ型(Memo)、その他はテキスト型(Text)
  61:日付型(DatteTime)

SQLServerでの文字型列の数値変換

CAST関数を使う

1) 文字型列の値を数値変換して並べる
SELECT DISTINCT CAST(列名 AS NUMERIC) AS COL
FROM
テーブル名
ORDER BY COL

2) 最大+1の番号をNEXTIDとして取得する
SELECT MAX(CAST(列名 AS NUMERIC))+1 AS NEXTID
FROM テーブル名


OSQLで使えるストアドプロシージャについてのメモ書き

マニュアルとか何もない状態で調べたOSQLで使えるストアドプロシージャについてのメモ書き。
(ACCESSプロジェクトにてMSDEへ接続し「ストアドプロシージャ」を参考に調査。


■オブジェクト一覧(?)を表示
exec sp_help
go

データベース情報を表示
exec sp_help_fulltext_tables
go

ユーザー情報の表示
exec sp_helpuser
go
(参考;select * from master.dbo.sysusers)

ログインID情報を表示
exec sp_helplogins
go
(参考;select * from master.dbo.syslogins)

テーブルのインデックスを調べる
exec sp_helpindex TB_EXAMCODE_MASTER
go

テーブル一覧を表示
exec sp_tables [table_name[,owner]]
go

データベース接続情報(?)を表示
exec sp_who (またはsp_who2)
go

データベース内オブジェクト一覧表示
use simlabodb
select left(name,40) as objname, id, xtype
from sysobjects
where xtype = 'U'
go
----------------------------------
xtype = S ・・・ System Table
P ・・・ Stored Procedure
U ・・・ User Table
V ・・・ View
PK ・・・ Primary Key

テーブルの列名一覧を表示
select left(name,40) as objname, xtype, length, colid
from syscolumns
where id=( select id
from sysobjects
where name='TB_EXAM_RESULT')
order by colid
go

全テーブルの列名一覧
select Left(so.name,20) as tblname,
Left(sc.name,20) as colname,
sc.xtype,
sc.length,
sc.colid
from syscolumns sc,
sysobjects so
where sc.id=so.id
order by tblname, sc.colid
GO

2010年4月15日木曜日

VC++6.0 「1つ以上のブレークポイントが設定できませんでした。これらのブレークポイントは無効です。」

デバッグ実行しようとしたときにこんなメッセージが出てブレークポイントで止められないからデバッグできない! いや、デバッグ実行は出来るけどトレース出力でなんて・・・orz という貴方へ。

まずそのプロジェクト一式があるディレクトリのパスを見て、ASCII文字以外が含まれていないか見てください。半角カナも怪しいかもです。含まれる場合はパスをASCII文字だけになるよう名前を変更してください。

VSSを使用している環境なら、おそらくこの段階ではまだ表題のメッセージが出ます。VSSに格納してある$からのパスも同様にASCII文字だけになるよう修正します。(あとで.dswを開くときにたぶんVSS再接続の手続きが必要になります。)

そのあとプロジェクトワークスペース(.dsw)を開いて、念のためビルド環境をクリーンにして、さらに念のためにDebug構成であることも確認して、デバッグ実行してみましょう。私の場合はこれで直ったのですがいかがでしょうか。

デバッグ実行でブレークポイントで止めることができない原因が、ローカルのパスだけでなくVSSのパスにもあるなんて、思いもよらなかった。さすが英語圏の(ry

2008年10月7日火曜日

C#でListViewをOwnerDrawで描画するときの注意事項(たぶんMSバグ)

ListView.HideSelection = False にして「他のコントロールにフォーカスが移ってもListView上の選択項目を強調表示のままにしておきたい」ことはよくありますが、このケースでOwnerDrawを実装しようとすると問題があります。ListView.OwnerDraw = Falseにして各イベントハンドラを作成しても、選択行/非選択行の背景色の描画が意図どおりにいかない方は読み進んでみてください。

OwnerDrawで背景色の描画を行う場合、DrawItemイベント及びDrawSubItemイベントの引数DrawListViewItemEventArgsStateプロパティに"Selected"フラグが付いているか否かを判別して選択行/非選択行の描画を行います(多くのサンプルソースはそうしていました)。しかし、ListView.HideSelection = False の場合、なぜかすべての行が選択行であるかのようにイベントハンドラの引数DrawListViewItemEventArgs.Stateプロパティに"Selected"フラグが付いているという現象です。ListView.HideSelectionプロパティをデフォルトのTrueに戻したところ現象が解消されたので間違いないと思います。

他にスマートでいい回避策があるのかもしれませんが、私の場合は ListViewの SelectedIndexChangedイベントで選択行をクラス変数などに保持しておき、DrawItemイベント及び DrawSubItemイベントハンドラの中で DrawListViewItemEventArgs.ItemIndexと同一の場合に選択行と判別するようにしました。

ネットで検索してもなかなかいい情報が出てこずに困っていたので、同様のお悩みを抱えている方のためにもメモ書きとして残しておきます。(というより自分用でもあるけど。)

なお、.NET Framework は 2.0 です。