スポンサーサイト

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

テーブル情報の取得

SQL Serverに関する話です。

テーブル構造に関する情報(変数名や型、Primary Keyなど)を取得する方法です。

ココを参考にさせていただきました。

 

DB情報を取得するマクロ

-- マクロ登録 ---------------
create procedure DBInfo
as
BEGIN
    /* テーブル定義情報を取得 */
    SELECT              DB_NAME()                       AS db_name
             	      , SCHEMA_NAME(tables.schema_id)   AS schema_name
            	      , tables.name                     AS table_name
            	      , tables.type_desc                AS table_type
            	      , extProp.value                   AS table_comment
        FROM            sys.tables tables
	    /* コメントデータは拡張プロパティシステムビューに存在する */
        LEFT OUTER JOIN sys.extended_properties extProp
                    ON  extProp.class    = 1                /* テーブルの場合、classの値は常に1 (OBJECT_OR_COLUMN) */
    			    AND tables.object_id = extProp.major_id /* テーブルのobject_idはmajor_idと対応する */
    			    AND extProp.minor_id = 0                /* テーブルの場合、minor_idの値は常に0 */
        ORDER BY        db_name, schema_name, table_name
    ;
END
go

-- 使い方 --;
DBInfo

 

テーブル情報を取得するマクロ

-- マクロ登録 -----------------------------
create procedure TableInfo
    @tblname nvarchar(255)
as
BEGIN
    SELECT              DB_NAME()                         AS db_name
                      , SCHEMA_NAME(tables.schema_id)     AS schema_name
                      , tables.name                       AS table_name
                      , columns.name                      AS column_name
                      , columns.column_id                 AS ordinal_position
                        /* PKか否かの判別フラグ */
                      , CAST(CASE WHEN pk_cols.key_ordinal IS NOT NULL THEN 1 ELSE 0 END AS bit) AS is_primary_key
                      , pk_cols.constraint_name           AS pk_constraint_name
                      , pk_cols.key_ordinal               AS pk_key_ordinal
                        /* ユニークキー(UQ)か否かの判別フラグ */
                      , CAST(CASE WHEN uq_cols.key_ordinal IS NOT NULL THEN 1 ELSE 0 END AS bit) AS is_unique_key
                      , uq_cols.constraint_name           AS uq_constraint_name
                      , uq_cols.key_ordinal               AS uq_key_ordinal
                      , TYPE_NAME(columns.system_type_id) AS column_data_type
                      , defaultConstraints.definition     AS column_default
                      , columns.is_nullable               AS is_nullable
                      , columns.max_length                AS max_length
                      , columns.precision                 AS precision
                      , columns.scale                     AS scale
                      , extProp.value                     AS column_comment

        FROM            sys.tables                                      tables
        INNER JOIN      sys.columns                                     columns
                    ON  tables.object_id = columns.object_id
        /* DEFAULT制約定義を取得する為に以下の二つのテーブルを外部結合 */
        LEFT OUTER JOIN sys.sysconstraints                              constraints
                    ON  columns.object_id = constraints.id
                    AND columns.column_id = constraints.colid
                    /* DEFAULT制約を表す疑似ビットマスク値 (マスクしていないと取得できない場合があるとのこと. (thanks murasukeさん) */
                    AND (constraints.status & 2069) = 2069               
        LEFT OUTER JOIN sys.default_constraints                         defaultConstraints
                    ON  constraints.constid = defaultConstraints.object_id
                    AND tables.schema_id    = defaultConstraints.schema_id
        /* コメントデータは拡張プロパティシステムビューに存在する */
        LEFT OUTER JOIN sys.extended_properties                         extProp
                    ON  extProp.class = 1  /* カラムの場合、classの値は常に1 (OBJECT_OR_COLUMN) */
                    AND columns.object_id = extProp.major_id
                    AND columns.column_id = extProp.minor_id
        /* プライマリーキーの情報を取得する為に以下の情報を外部結合 */
        LEFT OUTER JOIN (
            SELECT          key_const.name       AS constraint_name
                          , idx_cols.key_ordinal AS key_ordinal
                          , cols.name            AS col_name
                          , cols.object_id       AS col_object_id
                          , cols.column_id       AS col_column_id
            FROM            sys.tables                                  tbls
            /* PKの情報を結合 */
            INNER JOIN      sys.key_constraints                         key_const
                        ON  tbls.object_id = key_const.parent_object_id
                        AND key_const.type = 'PK'
            /* 対応するインデックス情報からカラムと特定 */
            INNER JOIN      sys.index_columns                           idx_cols
                        ON  key_const.parent_object_id = idx_cols.object_id
                        AND key_const.unique_index_id  = idx_cols.index_id
            INNER JOIN      sys.columns                                 cols
                        ON  idx_cols.object_id = cols.object_id
                        AND idx_cols.column_id = cols.column_id
        )                                                               pk_cols
                    ON  columns.object_id = pk_cols.col_object_id
                    AND columns.column_id = pk_cols.col_column_id
        /* ユニークキーの情報を取得する為に以下の情報を外部結合 */
        LEFT OUTER JOIN (
            SELECT          key_const.name       AS constraint_name
                          , idx_cols.key_ordinal AS key_ordinal
                          , cols.name            AS col_name
                          , cols.object_id       AS col_object_id
                          , cols.column_id       AS col_column_id
            FROM            sys.tables                                  tbls
            /* UQ(ユニークキー)の情報を結合 */
            INNER JOIN      sys.key_constraints                         key_const
                        ON  tbls.object_id = key_const.parent_object_id
                        AND key_const.type = 'UQ'
            /* 対応するインデックス情報からカラムと特定 */
            INNER JOIN      sys.index_columns                           idx_cols
                        ON  key_const.parent_object_id = idx_cols.object_id
                        AND key_const.unique_index_id  = idx_cols.index_id
            INNER JOIN      sys.columns                                 cols
                        ON  idx_cols.object_id = cols.object_id
                        AND idx_cols.column_id = cols.column_id
        )                                                               uq_cols
                    ON  columns.object_id = uq_cols.col_object_id
                    AND columns.column_id = uq_cols.col_column_id

        WHERE           tables.name = @tblname
        ORDER BY        db_name
                      , schema_name
                      , table_name
                      , columns.column_id
    ;
END
GO

-- 使い方 -------------------------
TableInfo 'tbl_test';

 

以上です

スポンサーサイト

SQL ServerでBULK INSERT (BCP)する時の終端文字トラブル(1A)

SQL Serverで、テキストファイルをBULK Insertで取り込もうとしたら、
「」
というエラーが出て取り込めなかった。

ファイルをバイナリエディタで見ると、[1A]というのが最後についていた。
これは、UNIXでテキストファイルを作った際の終端文字

これがあることで、BULKINSERTできない。

解決策は、「そのファイルをコピーして[1A]をなくす」といったベタなものしか見当たらなかった。

なので、次のようなちょっとカッコ悪い解決策。

--- バッチコマンド(コピー)をSQL内で使うため、sp_cmdshellを利用可能にする ---
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO

--- 元データの終端文字(1A)を取り除くため、コピーコマンドを実行 ---
xp_cmdshell 'copy /Y ***元ファイル名***.csv /a ***新ファイル名*** /b'''

--- BULK INSERTで取り込み ----------------------------
BULK INSERT     テーブル名
    FROM        '***新ファイル名***'
    WITH (
        FIELDTERMINATOR  = '',''
      , ROWTERMINATOR    = ''\n''
    )
;

AdStir : 広告の表示/非表示(動的に変更)

携帯アプリに広告を出す際、ずっと出しっぱなしの設定だとマニュアルなどに書いてあり、超簡単にできるけど、表示/非表示の仕方が分からず迷いました。

ちなみに、AdViewのサポートデスクに問い合わせしたところ、10日経っても返信なく、催促したらすぐ回答がきました。忘れてたやろ・・・

あげくに、ぜんぜん的を得ない1行回答。「表示させる場合は、Webのマニュアルをご覧ください」ですって。ちょっとげんなり・・・


というわけで、流れは以下のとおり。

  1. ①xmlレイアウトで、AdStir用のLayoutを作る
  2. ②その上にAdStirを置く
  3. ③JAVAコードで、AdStirを置いたLayoutを表示/非表示にする。

なかなかこれに気づけなかった・・・


具体的なソースコードです。

なお、AdStir広告を出す時、メイン画面に網掛けをしたかったので、FrameLayoutを使っています。

blkという画像を使っていますが、単純な黒い四角の画像です。サイズは適当でOKです。

[画像:blk]

これをdrawableフォルダに保存してください。

blk.png

①xml上のレイアウト

<FrameLayout 
    android:id="@+id/layout_adstir"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:visibility="gone"           >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        android:alpha="0.5"
        android:src="@drawable/blk"
    />
        
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:orientation="vertical" >

        <com.ad_stir.AdstirView
            android:id="@+id/adstir2"
            media="MEDIA-*******f"
            spot="*"
            android:layout_gravity="center" 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
        />
        <Button
            android:id="@+id/btn_cloasead"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="広告閉じる"
            android:alpha="1" 
        />
        
    </LinearLayout>
</FrameLayout>

②JAVAコーディング

以下の2つを、例えばOnCreateの中に書きます。

表示させる時

((FrameLayout) findViewById(R.id.layout_adstir)).setVisibility(View.VISIBLE) ;

非表示にする時 ・・・ AdStir広告の下にボタンを配置しており、それがクリックされた時に閉じるようにします。

// AdStir閉じるボタン
((Button)findViewById(R.id.btn_close_ad)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        ((FrameLayout) findViewById(R.id.layout_adstir)).setVisibility(View.GONE) ;
    }
});


ハッピーメールバナー

VB:Notesのデータベースを読み込むAPI

Notesからデータを直接吸い出したかったのですが、やっとそのやり方がわかりました。
なのでメモ。

特に、「いついつ以降に新規作成・更新になったデータ」の吸出しができずに悩んでました。
Searchメソッドを使えば解決しました。





Dim wkNotesSsn As Object
Dim wkNotesDB As Object
Dim wkNotesDocs As Object, NDoc As Object

dim svr as string
dim nm as string
svr = "サーバー名"
nm = "ファイル名"

Set wkNotesSsn = CreateObject("Notes.NotesSession")
Set wkNotesDB = wkNotesSsn.GetDatabase(svr, nm)

'-- 全部のデータを取ってきたいときは、コレ --
Set wkNotesDocs = wkNotesDB.AllDocuments

'-- 期間を区切って取ってきたい場合は、コレ --
Set wkNotesDocs = wkNotesDB.Search("@all", wkNotesSsn.CreateDateTime("12/31/2013"), 0)




Dim データ As String, sval As String
Dim n As Long
Dim i As Integer
Dim bar As String

bar = Application.StatusBar


'-- データ取得 -------------
n = 0
ReDim results(1000)
Set NDoc = wkNotesDocs.GetFirstDocument

Do Until NDoc Is Nothing

If NDoc.NoteID <> "" Then

id = NDoc.NoteID
dt = NDoc.LastModified
sval = NDoc.GetItemValue(Split(columns(i), ",")(1))(0)

If n Mod 1000 = 0 Then
ReDim Preserve results(UBound(results) + 1000)
End If

End If

Set NDoc = wkNotesDocs.GetNextDocument(NDoc)
Loop

'配列の微調整
For i = UBound(results) To 0 Step -1
If results(i) <> "" Then
ReDim Preserve results(i)
Exit For
End If
Next i

Tipsやチュートリアルの作り方

アプリの説明を、アプリ自体にチュートリアル(Tips)として入れたい場合のやり方です。
オーバーレイででレイヤー的に画像を差し込んで、ボタンの上に吹き出しを描画します。

画像の準備(吹き出し・グレーアウト用)
吹き出しに使う画像と、実際の画面をグレーで覆うための画像です。
グレーで覆うといっても、真っ黒な四角の図形を透過させているだけです。

以下の画像をRes\Drawableに保存してください。

グレーアウト用(以下の小さい黒いぽちっとした点の画像です)
blk.png

吹き出し用
注意!FC2の仕様で、ファイル名にピリオドが打てないため、以下の吹き出しをダウンロード後、ファイル名を次のように変えてください。
small_fukidashi_ul_9.png -> small_fukidashi_ul.9.png
small_fukidashi_dl_9.png -> small_fukidashi_dl.9.png

small_fukidashi_ul_9.png
small_fukidashi_dl_9.png

レイアウトの変更
複数の画像を重ねて表示するため、FrameLayoutに変更します。
注意1:実際の画面はLinearLayoutなどで囲まれているかと思いますが、このLinearLayoutは残します。残さないと、すべてが左端にギューッと集まってしまいます。

FrameLayout
  → その中にLinearLayout → その中に画面
  → グレーアウト用画像
  → 吹き出し
といった構造です。

注意2:グレーの幕を画面一杯に出すため、FrameLayoutは「fill_parent」を指定しています。
また、小さい画像を画面いっぱいに広げるため、スケールタイプをfixXYにしています。
android:scaleType="fitXY"
また、画像を透過させるため、アルファ値を0.5にしています。
android:alpha="0.5"

注意3:吹き出しは、TextViewです。



具体的には、以下のような感じ。
112aaa.png




<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>

<!-- 実際の画面・・・LinearLayoutで囲む -->
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>

<Button
android:id="@+id/btn1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="ボタン"
/>
</LinearLayout>

<!-- グレーアウト用画像 -->
<ImageView
android:id="@+id/blk"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:alpha="0.5"
android:src="@drawable/blk"
/>

<!-- 吹き出し:テキストビューです -->
<TextView
android:id="@+id/tips01"
android:layout_marginLeft="50dp"
android:layout_marginTop="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ココをタップしてね"
android:textAppearance="?android:attr/textAppearanceSmall"
android:background="@drawable/small_fukidashi_ul"
android:textColor="#ff0000ff"
/>
</FrameLayout>


MainActivityの修正
吹き出しがタップされたら画像を消すためのコードです。
OnCreateを次のように変えます。




@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Tisp制御:01
TextView tv01 = (TextView) findViewById(R.id.tips01);
tv01.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
((TextView) findViewById(R.id.tips01)).setVisibility(View.GONE);
((ImageView) findViewById(R.id.blk)).setVisibility(View.GONE);
}
});

((ImageView) findViewById(R.id.blk)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.tips01)).setVisibility(View.VISIBLE);
}


以上です。


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