WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

MySQL での TableAdapter 構成ウィザード不具合

by WebSurfer 2018年2月10日 20:02

先の記事「MySQL をインストールしました(その 2)」で書きましたが、MySQL Installer 5.7.17 を使って、MySQL Community Server 5.7.17, Connector/Net 6.9.9 など、その時点での最新版の MySQL 関係のコンポーネントを一式インストールしました。(何をインストールしたかは記事を見てください)

その後 1 年も経っているのに何ですが、MySQL では Visual Studio の TableAdapter 構成ウィザードを使って型付 DataSet + TableAdapter を自動生成できないことに最近やっと気が付きました。(汗)

備忘録として、自分の環境で起こった問題と解決策を書いておきます。ちなみに、自分の環境とは以下の通りです。(MySQL 関係はすべて MySQL Installer 5.7.17 でインストールしたものです)

  • Windows 10 Pro 64-bit
  • Visual Studio 2010 Pro / 2015 Community Update 3
  • MySQL Community Server 5.7.17
  • MySQL for Visual Studio 1.2.6
  • Connector/Net 6.9.9

上記の環境で TableAdapter 構成ウィザードを使って型付 DataSet + TableAdapter を生成すると、最後のステップで "[A] MySql.Data.MySqlClient.MySqlConnection は [B] MySql.Data.MySqlClient.MySqlConnection にキャストできません。" というエラーになります。

以下の画像を見てください。

Visual Studio 2010

Visual Studio 2010

Visual Studio 2015

Visual Studio 2015

エラーメッセージを見ての想像ですが、Visual Studio のウィザードが使う MySql.Data.dll のバージョン 6.9.8 と、GAC の MySql.Data.dll のバージョン 6.9.9 に不一致があって、それが原因でウィザードが期待通り動かないようです。

自分の PC のフォルダの MySql.Data.dll のバージョンを調べてみると、確かにエラーメッセージの通りのバージョンの相違がありました。

TableAdapter 構成ウィザード以外での不具合としては、ASP.NET Web Forms アプリで使用される SqlDataSource の例があります。

ウィザードの最後のステップで[クエリのテスト]を行うと、"オブジェクト参照がオブジェクト インスタンスに設定されていません。" というエラーになります。

以下の画像を見てください。

SqlDataSource の場合

Visual Studio のサーバーエクスプローラーから MySQL に接続するのは問題ないのですが、どうもウィザードが MySQL に接続に行くとダメな感じです。

ググって調べると、同様な問題が MSDN フォーラムの記事MySQL のフォーラムの記事 に報告されているのが見つかりました。

いずれの記事にも Connector/NET 6.9.9 をアンインストールしてから Connector/NET 6.9.8 をインストールして解決したと書いてあります。

Connector/NET のアンイストールはいろいろトラブルがある様子で、クリーンにアンインストールできるかどうか不安がありましたが、ウィザードが使えないと不便なので自分もやってみることにしました。

まず Connector/NET 6.9.9 のアンインストールですが、「コントロールパネル」⇒「プログラムと機能」を使って行うのではなく、MySQL Installer の Remove 機能を使うのがよさそうです。

Connector/NET 6.9.9 の Remove

上の画像で[Execute]ボタンをクリックするとエラーなく Remove は完了し、GAC, レジストリ, Program Files フォルダ, machine.config にも削除結果が反映されており、クリーンにアンインストールできました。トラブルがあるのではという心配は杞憂だったようです。

Connector/NET 6.9.8 のインストールも MySQL Installer を使ってできないかトライしたのですが、"No valid download found for product Connector/NET 6.9.8" が解消できず断念。

やむを得ないので別途ダウンロードした Connector/NET 6.9.8 の msi を起動してインストールしました。MySQL Installer に認識されなくて後で管理がやりにくいかもしれないと思いましたが、そんなことはなかったです。

Connector/NET 6.9.8

その後、Visual Studio 2015 で TableAdapter 構成ウィザードを使って型付 DataSet + TableAdapter を作ってみましたが、上に述べた問題は解消されていました。

ASP.NET Web Forms アプリ用の SqlDataSource も試してみましたが、ウィザードから MySQL に接続できないという問題も解消されていました。

Tags: ,

MySQL

リソースから画像を取得する際の注意点

by WebSurfer 2018年2月6日 17:02

リソースから画像を取得すると、取得するたび毎回新しい Bitmap オブジェクトが生成されるいう話を書きます。(元の話は MSDN Forum のスレッド「C#でのIF文を使ったフォーム背景画像の設定方法について」のものです)

リソースの画像

Visual Studio 2015 のテンプレートから Windows Forms アプリを生成すると、Properties フォルダ下にリソースファイル Resources.resx と厳密に型指定されたリソースクラス Resources.Designer.cs が自動生成されます。上の画像は、そのリソースに .png ファイルを追加したものです。

そうすると、厳密に型指定されたリソースクラス Resources.Designer.cs に以下のコードが自動生成されて、image プロパティでリソースの .png ファイルから Bitmap オブジェクトを取得できるようになります。

internal static System.Drawing.Bitmap image {
  get {
    object obj = 
      ResourceManager.GetObject("image", resourceCulture);
    return ((System.Drawing.Bitmap)(obj));
  }
}

image プロパティは ResourceManager.GetObject メソッドを使っているところに注目してください。

MSDN ライブラリ ResourceManager.GetObject メソッド (String, CultureInfo) の説明によると "同じ name パラメーターで GetObject メソッドを複数回呼び出した場合、戻り値が同じオブジェクトの参照になるとは限りません・・・" とありますが、画像の場合は毎回新しい Bitmap オブジェクトが生成されるようです。

リソースから画像取得

上の画像で isEqual1 が false になることがそれを裏付けていると思います。isEqual2 は当然ながら true になります。

それがどうしたって言われそうですが、自分としては新しい発見だったということで備忘録として書いておくことにしました。(笑)

Tags: ,

.NET Framework

inc ファイルの C# コードにブレークポイント

by WebSurfer 2018年1月22日 19:02
ASP.NET で使用する .inc ファイルの C# コードにブレークポイントを設定するにはどうすればいいかを書きます。(そもそも .inc ファイルに C# のコードを書く必要があるのかという話はちょっと置いときます)

inc ファイルのコードにブレークポイント

元の話は terateil のスレッド ASP.NETのデバッグについてです。

C# のコードを .inc ファイルに含めて、コードビハインドの .aspx.cs ファイルの C# のコードと同様に ASP.NET にコンパイルさせることができます。

ただし、少なくとも自分の環境では、デフォルトではブレークポイントを設定できませんでした。クリックして特定の行にブレークポイントを設定しようとすると <script runat="server"> の行に設定されるように見えますが、デバッグ実行で止まりません。

どうすればよいかと言うと、Visual Studio の設定で[ツール(T)]⇒[オプション(O)...]⇒[テキストエディタ]のファイル拡張子に inc を追加してやります。

テキストエディター、ファイル拡張子の設定

Visual Studio のヘルプによると、この設定で "特定の拡張子を持つすべてのファイルを Visual Studio 統合開発環境 (IDE) で扱うように指定できます" とのことです。文字のハイライトやインテリセンスが働くようになるだけでなく、ブレークポイントの設定も可能になります。(自分の環境では、.inc ファイルをいったん閉じて再度開く必要がありましたが)

知ってました? 実は、自分は teratail のスレッドで聞くまで知らなかったです。もっと正直に言うと、C# のコードを .inc ファイルに含めても、リテラル扱いとなって、生の C# のコードがそのまま html ソースに出力されると思ってました。(汗)

以下に、検証に使ったコードと、若干のコメント・注意点を書いておきます。

.inc ファイル

この例では JavaScript のコードと C# のコードの両方を含めました。JavaScript のコードは、インラインで .aspx ファイルに書き込んだのと同様にリテラルとして取り込まれ、そのまま html ソースに書き出される。一方、C# のコードはコードビハインド扱いとなり、.aspx.cs ファイル の C# のコードと同様にコンパイルされます。

System.Diagnostics.Debugger.Break(); はブレークポイントが設定できないと思ったので代わりに置いたものです。不要となったのでコメントアウトしました。

<script type="text/javascript">
    var msg = "message";
    // alert(msg);
</script>

<script runat="server">
    protected void Selection_Change(Object sender, EventArgs e)
    {
        //System.Diagnostics.Debugger.Break();
        
        DropDownList ddl = (DropDownList)sender;

        Label1.Text = ddl.SelectedValue;
        
        int i;
        for (i = 0; i < 10; i++)
        {
            //System.Diagnostics.Debugger.Break();
        }
        
        Label1.Text += ", i = " + i.ToString();
    }
</script>

.aspx.cs ファイル

コードビハインドとして Visual Studio が自動生成した C# のコードです。自動生成されたコードのそのままで手は加えていません。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _0023_includeFile : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
    }
}

.aspx ファイル

<!-- #include file ="analytics.inc" --> で上の .inc ファイルを取り込みます。本体には DropDownList と Label を配置。DropDownList の SelectedIndexChanged イベントのハンドラは .inc ファイルの C# のコードに定義しました。

ASP.NET がこのコードをコンパイルする際、.inc ファイルの JavaScript のコードはそのままリテラルとして取り込まれます(結果、html ソースにはその位置にそのまま JavaScript のコードが書き出されます)。.inc ファイルと .aspx.cs ファイルの C# のコードはコンパイルされます。

<%@ Page Language="C#" AutoEventWireup="true" 
    CodeFile="0023-includeFile.aspx.cs" 
    Inherits="_0023_includeFile" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
  <!-- #include file ="analytics.inc" -->
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:DropDownList id="ColorList"
      AutoPostBack="True"
      OnSelectedIndexChanged="Selection_Change"
      runat="server">
      <asp:ListItem Selected="True" Value="White">
        White
      </asp:ListItem>
      <asp:ListItem Value="Silver">
        Silver
      </asp:ListItem>
      <asp:ListItem Value="DarkGray">
        Dark Gray
      </asp:ListItem>
      <asp:ListItem Value="Khaki">
        Khaki
      </asp:ListItem>
      <asp:ListItem Value="DarkKhaki">
        Dark Khaki
      </asp:ListItem>
    </asp:DropDownList>
    <br />
    <asp:Label ID="Label1" runat="server" />
  </div>
  </form>
</body>
</html>

Tags: ,

ASP.NET

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  2018年4月  >>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

View posts in large calendar