【SQL Server】Alter Table 項目の追加・変更・削除

今日はSQL Serverネタです。
最近、Azure SQLの開発をしているのですが、SSMS(SQL Server Management studio)からテーブルの構造を更新できないのでデータ定義言語(Data Definition Language, DDL)で更新しています。

開発時はローカルのSQL Serverで全て行っていたのですが、いざAzure SQLにリリースという段階になるとローカルで修正して本番に移すという作業が出来ない状況になることがあります。
客先で桁あふれデータを見つけたりしてね。。。
そんな時、常日頃SSMSで行っていたテーブル構造の変更をDDLでやらなくてはいけないので、あれ?なんだったけ?ってなります。

ちなみに、Azure SQLをSSMSで行うことはSQL Server 2016のSSMSまではできませんでしたが、SQL Server 2016のSSMSでは可能になりました。この記事を書いている段階ではCTP3版ですが、問題なく編集できます。
非常に助かります。今まで当たり前にできてたことができないって、ほんと面倒に思えますから。
テーブル構造も早く変更できるようにしてもらえればありがたいのですが。。。

本題に戻ります。
忘れてしまっていたテーブル構造を変更するDDLですが、以下の通りです。
追加:Alert Table [table] add [column_name] [column_datatype](,[column_name] [column_datatype]);
変更:Alter Table [table] alter column [column_name] [column_datatype](,[column_name] [column_datatype]);
column名の変更:sp_rename @objname='[table].[old_column_name]’, @newname='[new_column_name]’, @objtype=’column’;
削除:Alter Table [table] drop column [column_name](,[column_name]);

こんな感じです。
その内SSMSで変更できるようになると思います。
本来、Azure SQLにテストリリースする段階では、仕様の変更など無いにこしたことなのですが、実データを流し込むと桁あふれが起こったり、エンドユーザが実画面を見て「こうだったらもっと便利なのに」ってフラグを追加して処理を分岐させたり、いろいろなケースでちょっと修正となることも多いと思います。
特に中小企業では業務設計も仕様確定も固まっていないことも多く、手戻りを覚悟して構築していくことも多々あるので。
この辺りの事前把握を行う構築スキルをもっと磨いていきたいです。

Alter TableのSQL Serverの備忘録まで。

【ASP.NET】RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます

前回の続きです。
GridViewを利用したExcelファイル出力の際に、『GridViewのコントロールGridView1は、runat=server を含む form タグの内側に置かなければ成りません』のエラーになってしまう対応の続きです。

前回は、

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    ' このOverridesは以下のエラーを回避するために必要です。
    ' 「GridViewのコントロールGridView1は、runat=server を含む
    '  form タグの内側に置かなければ成りません」    
  End Sub

を入れることで、VerifyRenderingInServerFormをOverridesして、サーバー フォーム要素の表示方法が異なっているページは、異なった条件の下でこのメソッドをオーバーライドして例外をスローしました。
第一関門突破です。

しかし、『RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます』
が発生するようになりました。
どうやらGridViewの列にButtonFieldやCommandFieldを使用している場合に、PostBackを検証対象処理として登録を行う際にRegisterForEventValidation を呼び出すようで、この中で Render 中かどうかがチェックされてしまうようです。

で、さらにググると、このチェックを行うかどうかは EnableEventValidation プロパティで制御できるようです。

    Public Overrides Property EnableEventValidation() As Boolean
        Get
            ' 「RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます。」
            ' を出ないようにする
            Return False
        End Get
        Set(ByVal value As Boolean)
        End Set
    End Property

これでエラーが発生せずExcelファイルの出力が可能になりました。
めでたしめでたし^^

ただ、単純にFalseにすると、今回の私のように入力コントロール等があるGridviewの場合、セキュリティ上まずいと思われるので、Excelファイルを作るときのみFalseになるように制御しないといけないと思います。

今回は気になったので調査しました。
以上ASP.NETのシステム開発備忘録でした。

【ASP.NET】GridViewのコントロールGridView1は、runat=server を含む form タグの内側に置かなければ成りません

今回はたまに使うGridViewを利用したExcelファイル出力の備忘録です。
Webフォームに更新可能でソートも可能なGridViewを作成しました。
帳票を作るときは、画面で仕様が固まった後、PDFもしくはEXCELをGridView経由で出力できるようにしています。

データ更新できるGridviewにすると、EXCEL出力する際にinputコントロールやSelectコントロールまで付いてしまうのでいつもは画面用のGridViewを流用することはしないのですが、何気なく流用してみたところエラーが出てしまいました。

『GridViewのコントロールGridView1は、runat=server を含む form タグの内側に置かなければ成りません』
です。
グッグってみたところ、

このコードを付け加えてみてください。
Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
End Sub

と言う記述を発見しました。

もう少し調べると
VerifyRenderingInServerFormの解説に、

<form runat=server>タグの内側に配置する必要があるコントロールが、表示される前にこのメソッドを呼び出すことができます。その
ため、そのようなコントロールがタグの外側に配置された場合、エラー メッセージが表示されます。登録したスクリプト ブロックをポストバックするコントロール、または登録したスクリプト ブロックに依存するコントロールは、Control.Render メソッドのオーバーライド部で、このメソッドを呼び出す必要があります。サーバー フォーム要素の表示方法が異なっているページは、異なった条件の下でこのメソッドをオーバーライドして例外をスローできます。

上のこのコードを付け加えてみてくださいとは、「異なった条件の下でこのメソッドをオーバーライドして例外をスローできます」のアドバイスに従ったものだとわかりました。

他のページには、更に

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    ' このOverridesは以下のエラーを回避するために必要です。
    ' 「GridViewのコントロールGridView1は、runat=server を含む
    '  form タグの内側に置かなければ成りません」    
  End Sub

のように親切に書かれているものもありました。

早速、試してみたところ、該当の『GridViewのコントロールGridView1は、runat=server を含む form タグの内側に置かなければ成りません』は出なくなりましたが、新たなエラーが。。。

『RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます』
が発生するようになりました。

これの対策はまた後日。。。

Windows10 Wifi接続のパスワードを調べる

今日はノートPCを持ち出して外で仕事をしています。
外では、インターネットに繋ぐのにスマホのテザリングを利用すると便利ですよね。
今日は他のデバイスも持って来ているのでそのデバイスからのインターネットに繋ごうと思ったのですが、テザリングするためのパスワードを確認する必要があります。

Windows 10でパスワードを確認しようとしたところ、右下に出ているインターネットアクセスから繋いでいるルータを右クリックしてもうんともすんとも言いません。プロパティが見えないようになっているようです。

素直にスマホで確認すれば良いのですが、、、どうなっているのか気になってしまって^^;
現在接続中のワイヤレスのプロパティを開ける場所を探せればOKだと思って少し探してみました。

まずは、ネットワークと共有センターを開きます。
手順 1: 左下のスタートメニュー?から[設定]をクリックし、設定画面を開きます。
手順 2: 設定画面から[ネットワークとインターネット]をクリックし、ネットワークとインターネットの設定画面を開きます。
手順 3: ネットワークとインターネットの設定画面の下の方の関連設定の中の [ネットワークと共有センター] をクリックしネットワークと共有センター画面を開きます。

ここからは、環境によって表示される名前が違うので、図も合わせて表示します。
手順 4: 図に示すところに現在接続中のネットワーク名が表示されていると思います。
ネットワーク接続1
私の場合だと、Wi-Fi(AndroidAP3)です。
このWi-Fi(AndroidAP3)をクリックし、Wi-Fiの状態画面を開きます。
手順 5:[ワイヤレスのプロパティ]をクリックします。
ネットワーク接続2
ワイヤレスネットワークのプロパティ画面が表示されます。
手順 6:[セキュリティ] タブを選択し、[パスワードの文字を表示する] を選択します。
ネットワーク接続3

ワイヤレス ネットワークのパスワードが [ネットワーク セキュリティ キー] フィールドに表示されます。
めでたしめでたし^^

以上、ちょっと気になったので備忘録として載せておきます。