だてブログ

ねことテクと趣味のブログ

Insertされた行のauto_incrementされた値をSelectする(何語)

主キーにauto_incrementが指定してあるテーブルに
insertした後、そのinsertした行のauto_incrementがされている値が欲しい場合、
Insertした直後にすぐにselect文でmax()や@@identifyを使って持ってくる方法がありますが、
複数からの同時実行などを考慮すると少し不安なものがありますよね、、、
色々試行錯誤して、ある記事 を参考にしてその解決方法を見つけました。

「Insert文にて"OUTPUT句"を使い、挿入した行の特定の値を抽出する」方法です。

id(Primary/auto_increment) name remarks
1 test1-1 test1-2
2 test2-1 test2-2
3 test3-1 test3-2

※ transactionによる処理(複数人からの同時実行考慮/主キーautoincrement時)

Private Function insertAndSelect() As Integer
    Dim conn As SqlConnection
    Dim cmd As New SqlCommand
    Dim tran As SqlTransaction
    DIm result As Integer = -1

    Const INSERT_STATEMENTS = 
        "INSERT INTO tbl(name, remarks)" & _
            ' OUTPUT句で挿入した行のidを返す
            "OUTPUT inserted.id" & _
                "VALUE('test4-1', 'test4-2')"
    Try
        cmd.Connection = con
        cmd.CommandType = cmd.CommandType ' 謎
        tran = conn.BeginTransaction()
        cmd.Transaction = tran 
        cmd.CommandText = INSERT_STATEMENT
        ' 返り値を一つだけ返す
        result = CInt(cmd.ExecuteScalar())
        tran.Commit()
    Catch ex As Exception
        Try
            tran.Rollback()
        End Try
    End Try
    return result
End Function

画面遷移&値渡しの試行錯誤

初めはこうしたかったのですが、何度やっても動かず。。。 Module1.vb - 共通クラス

Public Module Module1
 ' 諸事情で拡張メソッド使ってます。
    <System.Runtime.CompilerServices.Extension()>
    Public Sub TransitionForm(Form1 As Form, ByVal ParamArray args() As Object)
        args(0).show()
        My.Application.ApplicationContext.MainForm = args(0)
        arg(0)._passValue = args(1)
        Form1.Hide()
    End Sub
End Module

Form1.vb - 遷移前画面

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.TransitionForm(Form2, "test")
    End Sub
End Class

Form2.vb - 遷移後画面

Public Class Form2
    Public Shaared _passValue As Object
    Sub New(passValue As Object)
        InitializeComponent()
        Label1.Text = _passValue.ToString()
    End Sub
End Class

結局こうやったら普通に動きました。はぁ(*´Д`)(なんだかなぁ)

Module1.vb - 共通クラス

Public Module Module1
 ' 諸事情で拡張メソッド使ってます。使わなくても行けます。
    <System.Runtime.CompilerServices.Extension()>
    Public Sub TransitionForm(Form1 As Form, ByVal ParamArray args() As Object)
        args(0).show()
        My.Application.ApplicationContext.MainForm = args(0)
        Form1.Hide()
    End Sub
End Module

Form1.vb - 遷移前画面

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.TransitionForm(New Form2("test"))
    End Sub
End Class

Form2.vb - 遷移後画面

Public Class Form2
    Sub New(passValue As Object)
        InitializeComponent()
        Label1.Text = passValue
    End Sub
End Class

共通クラスにメソッドを書くやり方で(1つ目みたいなやり方)、 もっとスマートなやり方知ってる方いらっしゃったら 教えていくだちゃい。。。。もっと勉強しなきゃなぁ。

VB.net&Excel研修用語/操作メモ

Excelメモ

  • SHIFT + F3 か 入力フォームの「fx」ボタン -> 入力した関数の引数などを確認(「関数の引数ダイアログボックス」よく使う!)、関数名を入力中も(以降で、Shift+F3で出せる
  • 入力中に左にカーソルを移動したい場合(普通に左矢印を入力すると左のセルに移動してしまう) -> F2をおして入力モードにする

lesson1

  • フラッシュフィルとは

lesson2

操作 やり方
列移動 shiftキーと列枠すぐ下の十字矢印
横一列のデータを縦方向への貼り付けする

lesson3

  • P32 エラーの意味
エラー 意味
#### セル幅より長いデータなど
#VALUE 数式の参照先や関数に引数の種類などが正しくない
#DIV/0! 値が0 or 空白
#N/A 関数や数式に使用できる値がない
#NAME? 関数名が誤ってるなど
#NULL セル参照の書式が間違ってる
#NUM! 無効な数値がある
#REF! 数式で参照しているセルが削除
  • P32 絶対参照と相対参照
  • A$1 ... 列は相対参照、行は絶対参照
  • $A1 ... 列は絶対参照、行は相対参照
  • \$A$1 ... 絶対参照
  • A1 ... 相対参照
  • 範囲選択して入力して、挿入箇所でCTRL+Enter -> まとめて挿入
  • 編集モードか参照モードでF4 -> 「$」追加切り替え
  • 関数の引数が参照の場合、参照個所をCTRL押しながらクリックすると、",参照個所"と挿入される
  • 関数の引数入力時、ドラッグで、○○:○○となる。
  • =関数名...で関数名の候補が出てきたときTabで候補を選択

Lesson4

関数 意味
Count関数
RankEQ関数
PHONEC関数
LARGE/SMALL関数
AND/OR関数

lesson5

  • データの入力規則:データタブ->データの入力規則
  • 入力規則でリスト->入力候補を選ばせるセルを作れる(元の値で範囲指定するなど、よく使う)

  • VLOOKUP/HLOOKUP ... 該当するデータの組み合わせを検索する

  • VLOOKUP(検索対象(VLOOKUP関数以外の)、見出しを除いた検索範囲、列番号、True-範囲/False-個別)
  • 検索範囲の表は一番左に検索対象がなきゃだめ。
  • VLOOKUPは水平に見出しがある場合、HLOOKUPは垂直に見出しがある場合。

lesson8

  • データの入力後にEnterを押すと、通常すぐ下のセルに移動します、但し、Tabキーで右に移動した後にEnterを押すと「最初にTabを押した一つ下のセル」がアクティブセルになります。
  • 分割、ウィンドウ枠の固定、改ページプレビュー、ヘッダーフッターの設定、
  • 左下のシートタブの左となりを右クリックでシートの一覧

lesson9

  • テーブル

Lesson10

関数 意味
COUNTIF関数
SUMIF関数
AVERAGEIF関数
  • 条件付き書式
  • excelの図形 ... Shift + Ctrl + ドラッグでコピぺ
  • 選択->書式->図形の編集->図形の変更 で図形の変更
  • 複数選択->書式->配置->整列
  • ホーム->検索と選択->オブジェクトの選択 ... まとめて選択
  • グループ化
  • ホームタブ->検索と選択->数式->数式タブ -> 数式の表

VB.net 用語/操作メモ

初期設定

操作 操作方法
行番号表示 ツールタブ -> オプション -> テキストエディタ -> すべての言語 -> 全般 -> 行番号チェック

第一章 概要

用語意味
.net Framework無償でダウンロードできる
C++/CLI
ASP.net
ADP.net
dll/exeファイルクラスライブラリ/単独で動く
共通言語ランタイム(Common Language Runtime)
中間コード(Microsoft Intermediate Lnaguage)/ネイティブコード
JIT(Just In Time)コンパイラ
クラスローダー
ソリューションエクスプローラ
レイアウトファイル〇〇.designer.vb – いじくってはいけない

第二章 基本文法

用語 意味
ステートメント 一行のプログラムコード
インテリセンス 候補をだす。矢印で選びタブで補完、Ctrl+Spaceで出せる
コレクション オブジェクトや値を格納した配列や連想配列のことをコレクションと呼ぶことがある。[データやオブジェクトなどをまとめて格納するためのデータ構造やクラスなどの総称(IT用語辞典より)]、ここでは主に配列、連想配列など
スニペット 小さいかけら
  • VBではあまりメインメソッドを使った設計はしない
  • スタートアップフォームを閉じるとすべて閉じる

第三章 Windowsアプリケーション

  • listboxとcomboboxの違い ... 複数選択できるか否か
  • アンマネージドコード ... 使わない
  • コントロール ...
  • タブオーダー ...
  • アクセスキー ...

第四章 デバッグツールの利用と例外処理

用語 意味
ビルドエラー
実行時エラー
論理エラー
ウィンドウ ローカルウィンドウ、自動変数ウィンドウ、クイックウォッチウィンドウ、イミディエイトウィンドウ、出力、タスク一覧、コマンドウィンドウ、呼び出しウィンドウ
ウォッチウィンドウ ウォッチウィンドウ – デバッグタブ – ウィンドウ - .か右クリ-ウォッチ式追加
ステップイン 基本。一つずつ進める。呼び出し先も一つずつ進める
ステップオーバー 基本。一つずつ進める。呼び出し先はスルー一行。
ステップアウト 終わりまで一直線。
ビルド コンパイル
リリース exeファイル化
デバッグ コンパイルデバッグ情報付加
  • System.Exceptionクラス
    • System.Exception(親) ... すべての例外クラス
    • System.InvalidCastException(子) ... 無効なキャストの場合
    • System.OverflowException(子) ... 算術演算やキャストでオーバーフローが起きた場合。
    • ほか->.NET Frameworkの例外一覧

第五章 オブジェクト

  • オブジェクト ... メモリ上に作成される実態、データと処理で構成
    • インスタンス化 ... クラスをオブジェクト化すること
    • 詳細な仕組みや内部的な動作は知らなくても、使い方さえ知っていれば利用できる便利なもの ex). 車 、
    • 内部ではデータと処理に分かれる ex.) 処理: 走る データ: 速度、ガソリン量
    • カプセル化 … 密接に関連するデータと処理を組み合わせてひとまとめにし(一体化)、公開する情報と非公開の情報に分けて(情報隠蔽)、データ変更時にも関係する処理まで影響を及ぼさないようにする
  • 継承 … もともとのオブジェクトの性質を引き継ぐ
  • 多態性(ポリモーフィズム) … 同じ名前のメソッドでも異なるオブジェクトだと全く別の処理になること。(ex.スポーツカーのatとトラックのmt)
  • 型が処理を含める
    • 型 ... クラス/インターフェースなど
      • 値型 ... String以外の埋め込み型、変数として確保されたメモリ領域に値を保存
      • 参照型 ... オブジェクト指向、変数として確保されたメモリ領域に参照情報を保存し、値は変数とは別メモリ領域に保存する
    • 処理 ... イベントハンドラー/プロシージャーなど

第六章 クラス

  • 参照設定 ... 外部コンポーネント(dllファイル)を利用するための設定
  • 名前空間 ... 型名の重複を避けるために型名の論理的なグループ化。
    • 名前空間が違えば型名が同じでも利用できる
    • 完全修飾名を利用か、importsを利用か、[ソリューションエクスプローラー->設定ダブクリ->参照->インポートされた名前空間]
  • アセンブリアセンブリマニフェストメタデータ
  • メンバー ... メソッド(処理)、フィールド(データ)、イベント(処理)
  • オブジェクト指向は、必ずしも"データの定義"->"初期化"->"処理の定義"の順番というわけでもない
  • フィールド ... オブジェクト内のデータ
  • フィールドの初期化の方法
    • 既定値を利用(何もしない)
    • 初期化子の利用(宣言時に代入)
    • コンストラクターの利用 ... オブジェクトが生成されるタイミングで呼び出されるメソッド -> Newメソッドを使うかデフォルトコンストラクターを使う
  • メソッド ... オブジェクト内の処理
  • パラメーター ... オブジェクト内の引数
  • 値渡しと参照渡し -> 元の変更ありかなしか
  • オーバーロード ... 同じクラス内で同じ名前のメソッドを複数定義(ただし、パラメータの方や数を変える必要あり)
  • アクセス修飾子(access_modifier)
    • Private ... 同一の型に含まれる要素からのみアクセス可能
    • Protected ... 同一の型またはその派生型に含まれる要素からアクセス可能
    • Friend ... 同一のアセンブリに含まれる要素からのみアクセス可能
    • Protected Friend ... Protected or Friend アクセス可能
    • Public ... アクセス制限なし
  • Partialクラス ... 一つのクラスを複数に分割して記載する場合に利用する。
  • デストラクター ... オブジェクトが破棄されるタイミングで呼び出されるメソッド
  • プロシージャ ... コードブロック、メソッドのこと
    • Subプロシージャ ... 呼び出し側のステートメントに値を返さない、Voidメソッド
    • Functionプロシージャ ... 呼び出し側のステートメントに値を返す、戻値有メソッド
    • Propertyプロシージャ
      • クラスの中のプロパティとして使う、中にSet/Getアクセッサが必要
      • プロパティ内の変数には"_変数名"とするのが定番
  • プロパティ ... フィールドっぽい処理、論理的なフィールド
    • フィールドとの違い ... コードを実装することができ、値のチェックができる、読み取り、書き込み専用データを作成する
  • 共有メンバー ... グローバル変数、クラス内に一つだけ存在するメンバー、 <-> インスタンスメンバー
  • モジュール ... 昔使われていた、インスタンス化する必要ない、共有メンバーのみ

第七章 クラスの継承

  • 基本クラス ... もとになるクラス
  • 派生クラス ... もとになるクラスのメンバーを引き継いだり、必要な機能を追加した継承クラス
    • 多重継承(複数の元クラス)はできないが、多段継承(元々クラス->元クラス->.)はできる
    • 基本クラスは暗黙的にSystem.Objectを継承しているクラス
    • コンストラクター ... 非継承メンバー、それを宣言したクラスでしか有効ではない、ただし、暗黙的に親クラスのコンストラクタが呼び出される(ただしnew()に引数がない場合)&MyBase文などで呼び出し可能
      • 親クラスのコンストラクタを派生クラスで利用する場合、MyBase.New()を使うか、改めて親クラスのコンストラクタ内の処理を記述しなおす
  • 多態性(ポリモーフィズム) ... 継承における型変換
    • 異なるオブジェクトに対して同じメソッドを使って入力しても異なる値が出力される
    • オーバーライド
      • オーバーライドするメンバーの名前とパラメーターが基本-派生で一致が条件
  • 抽象クラス ... 共通のメンバーなどのみを定義した基本クラス(それだけでは機能しない)
    • インターフェース
      • ユーザー定義型、継承するクラスがインターフェースから継承したメソッドを定義する(インターフェースを実装する)
      • 多重継承が可能、アクセス修飾子を設定不可能、フィールドの宣言、定義ができない
  • 抽象クラスとインターフェースの違い ... 抽象クラスは派生クラスで定義する必要があるメソッドのほかに、中小クラス内で処理のあるメソッドが書ける点
  • for-eachもインターフェースが利用されている

    第八章 データベースの利用

  • 2大商用サーバー ... Oracle, SQLServer
  • ADO
    • データベースアクセスするライブラリ集
    • コピーをメモリーに格納して操作して、必要な時だけ接続する非接続型
  • オブジェクトモデル
    • 接続、利用方法を標準化するためにできたもの
    • データプロパイダー ... データソースにアクセスしたり操作、クエリをまとめて実行する
      • SQL Server, OLE DB, ODBCデータプロパイダ
      • Oracleは別途ダウンロードが必要
      • プリフィックス ... 接頭辞
    • データセット ... メモリ上にコピーされる仮想のDB、接続はできない。
    • 構成 ... Connection, Transaction, Command, Parameter, DataReader, DataAdapter, ConnectionStringBuilder, CommandBuilder, Exception
  • 認証方式
  • 動的プロパティ ... 接続先をあらかじめ設定で用意しておく。参照でSystem.Configuration.ConfigurationManagerを参照設定で見れるようにして、、、
  • データベースを起動()
  • 名前空間、参照設定を追加(System.configuration)

PS. By もーりー

  • Public, Friendのスコープの設定してるものをすべて継承する。ただしフィールドを継承する場合、問題が起きる。派生クラスはフィールドに依存するから基本クラスを変更することができなくなる。基本食らうのフィールドの計算値に変更しただけでも派生クラスは破壊されてしまう。だから基本クラスはPrivateフィールドだけ含むようにするのが一般的である。一部データをクラスの外部から参照できるようにする場合には常にフィールドの代わりにプロパティを使用する。プロパティは内部的な実装は派生暮らしに影響がない。いつでも変更が可能。