ラベル VisualStudio の投稿を表示しています。 すべての投稿を表示
ラベル VisualStudio の投稿を表示しています。 すべての投稿を表示

2017年7月21日金曜日

【SQL Server】【Visual Studio】【C#】DBからC#コード更新(上書き)

◆メニュー
 【SQL Server】開発環境構築(ER図作成にSSMSを使用)

◆手順

1.edmxファイルをダブルクリック。

2.モデルブラウザの空白部分を右クリックし、[データベースからモデルを更新]

3.「完了」ボタンを押下。

4. 変更されたことを確認(下図では生年月日が増えた)し、Ctrl+Sで保存。

5.以下が表示された場合は、「すべてに適用」ボタン押下。

6.生成されたコードも生年月日が増えている。

2017年7月15日土曜日

【SQL Server】【Visaul Studio】DBからC#コード生成

◆メニュー
【SQL Server】開発環境構築(ER図作成にSSMSを使用)

◆概要
SSMSで作成したDBインスタンスからC#のエンティティクラスを生成する手順

◆環境
Visual Studio Pro以上(Community版は未調査。)

1. Winキー押下し、visを入力し、Enterキー押下。(環境によってはVisだけでは足りないので、入力文字を増やすこと)

2. [ファイル]-[新規作成]-[プロジェクト]を選択。

3. 適切なテンプレートを選択し、適切なプロジェクト名を設定し、OKボタン押下。

4. Ctrl+Shift+Bでビルドし、F5キーで実行まで確認しておく。

5. プロジェクトを右クリックし、[追加]-[新しい項目]を選択。

6. 「ADO.NET Entity Data Model」を選択、適切な名前を入力し、「追加」ボタン押下。

7. 「データベースからEF Designer」を選択し、「次へ」ボタン押下。

8. サーバ名・データベース名を入力し、「テスト接続」ボタン押下。サーバ名・DBインスタンス名は読み替えること。

9. 「OK」ボタン押下。

10. 「接続設定に名前を付けて App.Config」に保存をチェックし、「次へ」ボタン押下。

11. 「Entity Framework 6.x」を選択し、「次へ」ボタン押下。

12. データベースオブジェクトは全選択し、「完了」ボタン押下。下記ではビューが存在しないため、チェックしていないが、基本的には全てにチェックを入れる。(モデル名前空間はDbEmployeesModelのようにしたほうがいいかも。)

13. 「OK」ボタン押下。

14. ソリューションエクスプローラーにedmxが作成され、配下にテーブル名.csが生成ていることを確認。

15. MainWindows.xamlをダブルクリックし、ツールボックスからButtonをD&D。

16. フォーム上に配置したbuttonを選択し、プロパティパネルの⚡ボタンを押下し、Clickテキストボックスをダブルクリック。
17. コードが生成されることを確認。

18. 下記のようにDBアクセスのコードを入力し、ビルド&実行。


namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            using (var ctx = new DB_EMPLOYEESEntities())
            {
                using (var tran = ctx.Database.BeginTransaction())
                {
                    ctx.T_部署.Add(new T_部署() { 部署ID = 1, 部署名 = "開発1" });
                    ctx.T_社員.Add(new T_社員() { 社員ID = 1, 姓 = "名無し", 名 = "太郎", 所属部署ID = 1 });

                    ctx.SaveChanges();
                    tran.Commit();
                }

                var ret = (from shain in ctx.T_社員
                           join bu in ctx.T_部署
                             on shain.所属部署ID equals bu.部署ID
                         select new { shain, bu }).First();

                // Namespace==Systemは、外部参照などを表示しないようにプリミティブとstringのみにフィルタ
                // しっくりこないが…。
                Func<object, List<string>> trans = o =>
                    (  from ps in o.GetType().GetProperties()
                      where ps.PropertyType.Namespace == "System"
                     select ps.Name + ":" + ps.GetValue(o, null)).ToList();

                MessageBox.Show(
                    string.Join(",", trans(ret.bu   )) + Environment.NewLine +
                    string.Join(",", trans(ret.shain)));
            }
        }
    }
}

19. Buttonを押下。

20. selectの結果も正しい。


21. SSMSで確認しても、レコードが挿入されていることが確認できる。


2017年3月16日木曜日

【C#】.NET3.5だとXML形式選択貼り付け(XML⇒クラスソース)できない

Visual StudioではクリップボードのXML文字列 をクラス(ソースコード)として貼り付ける機能がある。
この機能は、対象のフレームワークを3.5等にしておくと使用できない。
具体的に述べると、以下。

1. XML文字列をコピー(VisualStudioでなく、テキストエディタでも良い)。

2.生成したいcsファイルを開き、メインメニューの[編集]-[形式を選択して貼り付け]-[XMLをクラスとして貼り付ける]

3.通常は以下のようにコードが生成される。あとはシリアライズ・デシリアライズのコードを書けば、設定ファイル読み書きが簡単に実装できる。ちなみに、設定ファイルの実装は、app.configの方がもっと簡単なので、基本的にはそちらをお勧めする。


しかし、以下のように対象のフレームワークを.NET Framework3.5等の古いバージョンにしておくと、


手順1、2を実施しても以下のように貼り付けられない。(コードが空のままとなる)

対象のクライアントがWindows7で.NET Frameworkの更新ができないなどの状況では、.NET Framework3.5を採用する必要があるのだが、この場合、[形式を選択して貼り付け]が使えなくなってしまう。

◆単純な解決法

 以下のように別プロジェクトを追加して、適当なcsファイルを作成しておき、このプロジェクトのみ.NET Frameworkのバージョンを4.5以上にしておく。この状態で手順1、2を行えば、貼り付けられる。あとはそのコードを正式なcsファイルに貼り付ければよい。




2017年1月21日土曜日

【VisualStudio】2015 Enterprise参照関数の個数

Visual Studio 2015 Enterpriseでは、関数の上にその関数の参照元関数の個数が
表示される。不要な関数は、一目瞭然。


[Obsolete("試験未実施。使用する場合は、試験を実施して下さい。")]
等をつけておくと、下記のようにビルド時に・・・


使用箇所について、warningが出力される。


下記のように第2引数をtrueにすれば、呼び出し元でコンパイルエラーになる。

[Obsolete("試験未実施。使用する場合は、試験を実施して下さい。", true)]



せっかく作った関数が不要になってしまった場合で、残しておきたい場合は、こうしておく。将来、この関数を使用する時に試験未実施のままリリースしてしまうことが無いようガードがかけられる。

Obsoleteは旧型式の関数(廃止した関数)に対して使用するものなので、本来の意味合いとは異なる。適切な属性があると良いのだが。

2016年9月22日木曜日

【C#】【VisualStudio】開始オプションにXMLで勝手に補完される

あまりやらないと思うが、Visual C# 2005 (2015でも大体同じ・・・、おそらくその間のバージョンもそうだろう)で以下のようにコマンドライン引数にxmlを指定して保存すると・・・



slnを開き直した時に、以下のように勝手にネームスペース(xmlns)が追加されてしまう。
設計ミスだろ・・・、これ・・・。勝手に書き換えんな!


少し調べたがこれを直接回避する手段は見つからなかった。
ちなみに、上記のコマンドライン引数の値は以下のcsproj.userに保存される。




単体試験などで引数を指定する場合は、上記では困る。NUnitまたは、VS2012のMStestが使えるならそれらを使えばよいが、使えない場合は、別の方法が必要。

VS2005Pro以上では、デバッグのタブに[外部プログラムの開始]があり、batか何か指定してそれを経由すれば解決できると思われる。しかし、VS2005Express版では、デバッグのタブに[外部プログラムの開始]が存在せず、指定できない。

面倒だが、別プロジェクト(下記のTestDriverなど)を作成して、そこからTmp配下のProgram.Main()を呼び出す。

TestDriverプロジェクトを追加。(プロジェクト名は任意)


TestDriverプロジェクトにTmpプロジェクトの参照を追加。




下記のように参照設定配下にTmpが追加される。


ややこしいがTestDriverとTmpプロジェクト配下にそれぞれ、別のProgramクラスとMain()メソッドが存在している。Main()は大抵publicになってないため、TestDriver.Program.Main()から直接Tmp.Program.Main()は呼び出せない。下記のようにTmp.exeをアセンブリとして、TestDriverにLoadし、そのAssemblyからTmp.Programクラスを取得し、ProgramクラスのMain()をReflectionを使用して呼び出している。

ただし、この方法はTmp.Program.Main(string[] args)というシグネチャの場合(コマンドライン引数をMain関数の引数で持つ場合)のみ可能である。Tmp.Program.Main()というシグネチャ(関数の引数無し)で、System.Environment.GetCommandLineArgs()により、コマンドライン引数を取得している場合はこの方法は使用できない。Invoke時に例外が発生する。

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace TestDriver
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly asm = Assembly.Load(new AssemblyName("Tmp"));
            Type t = asm.GetType("Tmp.Program");
            System.Reflection.MethodInfo minfo = t.GetMethod("Main",
               BindingFlags.Static | BindingFlags.NonPublic);
            minfo.Invoke(minfo, new object[] { new string[] { "<tmp></tmp>" } });
        }
    }
}


デバッガ不要なら以下でもできるが、#ifディレクティブや相対パスが気に入らない。
using System;
using System.Diagnostics;

namespace TestDriver
{
    class Program
    {
        static void Main(string[] args)
        {
#if DEBUG
            string exePath = @"..\..\..\Tmp\bin\debug\Tmp.exe";
#elif RELEASE
            string exePath = @"..\..\..\Tmp\bin\release\Tmp.exe";
#else
#error Please make target configuration!!
#endif
            Process p = Process.Start(exePath, "<tmp></tmp>");
        }
    }
}


2016年9月12日月曜日

【TortoiseSVN】【VisualStudio】bin/obj/suoはコミット対象外

Microsoft Visual Studioで作成したプロジェクトには、ソースファイルやソリューションファイル、プロジェクトファイルのようなテキストファイル以外にも、exeファイルやユーザ毎の情報を格納するsuoのようなバイナリファイルも含まれる。

これらのバイナリファイルはSVNなどのリポジトリに登録する必要はない。よって、bin、objフォルダ、.suoファイルをコミットの対象外にする。対象外としておかないと、TortoiseSVNでコンフリクトが発生して、邪魔となる。

また、.userファイルはユーザー毎に変更可能なので適宜コミットしないようにすると便利。