ODT for Visual Studio 2017 でハマった話

Visual Studio 2017 Version 15.9.54にあげたあたりで、ODT(Oracle Developer Tools for Visual Studio 2017)の挙動が怪しくなった。
まず、Visual Studio を起動してソリューションを開くと、このようなダイアログが表示される。

ここで「はい」で返して、Configurationしてもらいましょうと...ん?

失敗する...
この繰り返し...
で、無視して既存のOracleテーブルのデータセットに、手動で列を挿入しようとすると

こんなエラーが表示される。

Oracleのサイトや、ぐぐって海外の諸々な情報をあさって、やっとのことで、
下記にパスにある devenv.exe.configの内容がおかしいことが判明。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\devenv.exe.config

この中の

<dependentAssembly>
  <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
  <codeBase version="4.122.18.3" href="c:\program files (x86)\oracle developer tools for vs2017\odp.net\managed\common\oracle.manageddataaccess.dll" />
</dependentAssembly>

の部分と

<DbProviderFactories>
  <remove invariant="Oracle.ManagedDataAccess.Client" />
  <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342" />
・
・
・
</DbProviderFactories>

この中の Oracle.ManagedDataAccess.Client の部分。
このあたりが欠落してないか要チェック。
環境やインストールしているODTのバージョンによって多少設定値が異なるので注意!
後になって思えば、最初に表示されたメッセージ
"Oracle Developer Tools For Visual Studio is not configured"
だったわけだけど、そもそもなぜこんな事態になったか根本の原因は不明。
Visual Studio 2017のマイナーバージョンアップで、devenv.exe.configが書き換えられていて、本来はODTがそれを検知して再構成してくれるハズができない。そういう状態。
今後、VSが再度マイナーバージョンアップしたら再現する可能性が高いので、バージョンアップ前にdevenv.exe.configをセーブした方が良いだろう。もしくはVSのメジャーバージョンアップ。

Oracle Client 11.2.0.3 x64

とある環境で「Oracle Provider for OLE DB」を使用する為「Oracle Client 11.2.0.3 x64」の媒体から、それがインストールされていました。しかし、.NET Framework2.0で操作するプログラムを実行すると「'OraOLEDB.Oracle.1' はローカルコンピュータに登録されていません。」とのエラーが返され、目的のDBに接続する事ができません。
このエラー、経験値では、.NETプログラムが「ANY CPU」でコンパイルされていたり、OSがx64で「x32」、またはOSがx32で「x64」でコンパイルされていると発生することが多いのですが、今回はそのあたりの矛盾もない状態。推測すると、「Oracle Provider for OLE DB」がOSに正しくレジストされていない様子。
他のPCで「Oracle Client 11.2.0.1 x64」の媒体からインストールされた環境があるのですが、こちらは正常操作。
結局、「Oracle Client 11.2.0.3 x64」ではなく「Oracle Data Access Component(ODAC) 11.2.0.3 x64」を使用し「Oracle Provider for OLE DB」を再インストールしたところ、正常に動作すように鳴りました。Oracleのサポートに持ち込んだ訳ではないので、断言は出来ませんが、現象からすると「Oracle Client 11.2.0.3 x64」のインストーラーに問題があるようです。

やっぱ、WPF かな...?

.NETでWindowsデスクトップアプリと言えば、WindowsForm だった訳ですが、ここ数日、Windowsデスクトップアプリでの、Entity FrameworkやLinq to Entityあたりを調べてたら、やっぱりもう、WindowsForm ではなく、Windows Presentation Foundation(WPF)だろうということが見えてきた。ただ、私が知る限り、業務系で積極的に採用されているようには見えないので、不安も感じるが、MS的な方向としては確実にWPF
生産性や保守性はどうなのであろうか?
その辺は、他人が書いた情報を見ているだけではわからないので、やはり自分で試すことが必要。
ちょっと書いてみよう。
ターゲットはより実用的なものがよい。
.NET Framework4.5 + WPF + Entity Framework + Linq + ODP.NET
この組み合わせで何か書いてみよう。

ODP.NET が NuGet に対応してた!

「何をいまさら...」と言われてしまいそうだけど、最近Oracleから少し離れていたら、
ODP.NET 12c Release3(12.1.0.2.1)から、NuGetに対応してたんですね。
発行日は2015/01/16と表示されているので、もう2ヶ月以上も前に...

今回はWindowsFormでの使用を前提に、早速試してみました。

NuGetのパッケージ管理から、Oracleで検索すると現れる赤い12cのアイコンがそれです。
2つあります。ひとつはEntity Framework6対応のドライバ。そしてもうひとつがODP.NETです。
2つ目のODP.NETをインストールすると、依存関係にある、Entity Framework6とEntity Framework6対応のドライバとともにODP.NETがインストールされます。
おお、なんと楽チンなんでしょう(笑)。
App.config が自動で生成されるので、とりあえず下記の箇所を動作させる環境に合わせて書き換えます。

  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="dsn" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hoge)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) "/>
      </dataSources>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client"
      connectionString="User Id=foo;Password=bar;Data Source=dsn"/>
  </connectionStrings>
</configuration>

とりあえず、簡単なテストを...
とあるテーブルから、全件をSelectし、textBoxに書き出す。

private void button1_Click(object sender, EventArgs e)
{
    this.textBox1.Text = "";
    using (var Conn = new OracleConnection())
    {
        Conn.ConnectionString = ConfigurationManager.ConnectionStrings["OracleDbContext"].ConnectionString;
        Conn.Open();
        string strSQL = "select CODE,NAME1 from TABLE1 order by CODE";
        OracleCommand Cmd = new OracleCommand(strSQL, Conn);
        OracleDataReader Reader = Cmd.ExecuteReader();
        while (Reader.Read())
        {
            this.textBox1.Text += Reader.GetString(0) + ":" + Reader.GetString(1) + "\r\n";
        }
        Reader.Dispose();
        Cmd.Dispose();
    }
}

たしか、すでに Code firstにも対応していたと思うので、近いうちにそちらも試してみようと思います。

Nexus5(5.0.1)でLTE/3Gが使えなくなった!

1年ほど前に Nexus5をGoogle Playで購入して MVNO(BIGLOBE)のSIM入れて使ってます(妻がw)。

電波は拾っているようなのですが、アンテナのアイコンに「!」が表示されて、モバイルネットワークが使えません。APNを再設定などしてみたけどダメ...

どんどん深みにハマって
system recoveryのメニューから
wipe cache partition を実行して再起動したら、
ロドイド君がお腹を上にして「!」を出しちゃう始末...
きゃぁ〜〜〜やっちまったかぁ?
気を取り直して再度 wipe cache をかけるとリカバリーしたようで
(ボリュームの大や小ボタンで動作が変わるので注意が必要
 ちょっと焦ってたので画像取り忘れた orz )
とりあえず元にもどった。が、そもそもの問題は解決せず...

振り出しに戻ったところで、最初から考えて見ることに。

端末の状態を確認すると、
「モバイルデータ通信」が「切断」
と表示されているということは、
単純に「使わない設定」になっているのではないかと。
で、ふと思う。
以前のバージョンで「モバイルデータ通信を有効にする」というメニューは何処へいった?

どうやら
[設定]-[データ使用量]-[モバイルデータ] の オン/オフ 
これに変わったらしい。
なんか変じゃないか?このメニュー。
なんで[データ使用量]の中に オン/オフ があるんだよ。

確認すると、なんとここが「オフ」になっているじゃないか!
「オン」に変えると、何事も無かったかのようにアンテナアイコンに「LTE」の表示が...

うーん、やっぱりあまり好きになれないな...Android
(個人的な感想ですw)