WebSurfer's Home

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

MySQL をインストールしました

by WebSurfer 2011年4月23日 23:12

2017/1/30 追記:
2017/1/27 時点での最新版 MySQL Community Server 5.7.17 と Connector/Net 6.9.9 をWindows 10 Pre 64-bit PC にインストールした時の話を「MySQL をインストールしました(その 2)」に書きました。以下の記事は 2011 年 4 月とかなり昔の話で、それからやり方が変わってきていますのでご注意ください。

自分が使っているホスティングサービスでは SQL Server の他に MySQL もサポートしているので、SQL Server が容量オーバーになる前に MySQL の方にも DB を分散できないか検討するため、開発環境に MySQL をインストールしました。

MySQL

インストールしたのは、このポストを書いている時点での最新版 MySQL Community Server 5.5.11 と Connector/Net 6.3.6 です。Connector/Net 6.3.x は .NET 4 と VS2010 をサポートしています。詳細は MySQL のサイトの Documentation の中の Chapter 2 Connector/Net Versions を参照してください。

まず、MySQL の ダウンロードサイト で MySQL Community Server(サーバー本体)と Connector/NET(ADO.NET や SqlMembershipProvider 相当のライブラリが含まれている)をダウンロードしてきます。

インストールの際、MySQL Community Server の方は細かい設定のオプションがあって、インストーラが英文でいろいろ聞いてきますが、よく読んで進めて行けば問題なく完了すると思います。ファイアウォールのポートの穴あけはデフォルトではない(チェックを入れる必要がある)ので注意してください。インストールの際設定するパスワードは後で使いますので、覚えておいてください。

Connector/Net の方は何も設定する必要はなく、VS2008 と VS2010 の設定まで自動でやってくれます。インストールすると Visual Studio から MySQL に接続できるようになります。

下の画像は Visual Studio のサーバーエクスプローラから接続の追加を行うときに表示されるダイアログです。

接続する DB の種類の選択

上のダイアログで[OK]をクリックすると「接続の追加」ダイアログ(下の画像)が現れます。ここで、先に MySQL Community Server のインストールの際に設定した Server name, User name, Password を入力し、接続する Database name を選択します。

接続の追加

上のダイアログで[詳細設定(V)...]をクリックすると「詳細プロパティ」ダイアログ(下の画像)が表示されます。ここで、Character Set の設定を、先に MySQL Community Server のインストールの際に設定したものにします。インストールのとき Best Support For Multilingualism を選択していると UTF-8 になります(ここでは UTF-8 ではなく utf8 と記入してください)。その他の設定は、自分が試した限りではデフォルトのままで OK でした。

接続の詳細プロパティの設定

以上の設定が終了すると、SQL Server データベースと同様に、サーバーエクスプローラに MySQL データベースの接続が表示されます。

Visual Studio から MySQL への接続

ただし、SQL Server と同様に新規テーブルを作成することはできないようです。自分が試した限りですが、どうしても主キーの設定ができませんでした。

自分が知らないだけで、やり方はあるのかもしれませんが、どうしても Visual Studio からはできなかったので、コマンドラインから作りました。

コマンドラインからテーブルの作成

アプリケーションの作成には Connector/NET 関係の dll への参照の追加が必要です。ただし、レンタルサーバーなど、Connector/NET がインストールされてない場合など、参照設定ではダメな場合は bin フォルダに dll をコピーすることになります。

2013/10/1 追記:ダウンロードした msi インストーラーを使って Connector/NET をインストール すると、自動的(勝手)に GAC に dll が登録され、さらに machine.config ファイルの DbProviderFactories セクション に MySQL 用プロバイダの構成情報が登録されます。なので、開発マシンに Connector/NET をインストールした場合、開発マシンでは Bin に dll をコピーするとか、machine.config を修正することは不要です。

先にも書きましたが、Connector/NET 6.3.x は .NET 4 にも対応していますが、.NET 2.0, 3.0, 3.5 と .NET 4 では使う dll が異なるので注意してください。

デフォルト設定のままインストールすると以下のフォルダに v2.0 と v4.0 という 2 つのフォルダができます。

C:\Program Files\MySQL\MySQL Connector Net 6.3.6\Assemblies

ASP.NET 2.0, 3.0, 3.5 では v2.0 の中の MySql.Data.dll を、ASP.NET 4 なら v4.0 の中のものを bin フォルダにコピーしてください。

接続文字列は、上の画像の「詳細プロパティ」ダイアログの下のほうに表示される Visual Studio からの接続文字列を参考に以下のように web.config に設定します。パスワードの設定に注意してください。

<connectionStrings>
  <add name="MySQL" 
    connectionString="server=localhost;User Id=root;
        database=test;Character Set=utf8;Pwd=********" 
    providerName="MySql.Data.MySqlClient" />
</connectionStrings>

後は名前空間 MySql.Data.MySqlClient をインポートすれば、SqlConnection, SqlCommand などに代えて MySqlConnection, MySqlCommand を使えるようになります。以下のような感じです。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="MySql.Data.MySqlClient" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
  DataTable CreateDataTable()
  {
    string connString =
      ConfigurationManager.
      ConnectionStrings["MySQL"].ConnectionString;
    string query = "SELECT * FROM products";
    using (MySqlConnection connection = 
        new MySqlConnection(connString))
    {
      MySqlCommand command = 
        new MySqlCommand(query, connection);
      MySqlDataAdapter adapter = new MySqlDataAdapter();
      adapter.SelectCommand = command;

      DataSet ds = new DataSet();
      adapter.Fill(ds);

      return ds.Tables[0];
    }
  }
    
  void Page_Load(Object sender, EventArgs e)
  {
    if (!IsPostBack)
    {
      GridView1.DataSource = CreateDataTable();
      GridView1.DataBind();
    }
  }
    
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:GridView ID="GridView1" runat="server">
    </asp:GridView>
  </div>
  </form>
</body>
</html>

Tags: ,

MySQL

ASP.NET MVC の勉強を始めました

by WebSurfer 2011年4月16日 21:51
ASP.NET MVC 実践プログラミング

ASP.NET MVC の勉強を始めました。

リリースされた当初は一時の流行だろうと思っていましたが、バージョン 3 がリリースされるに至って、どうもそうではなさそうな感じがします。

というわけで、時代に取り残されてはいけないと思って(笑)買ったのが左の写真の本です。

ASP.NET(MVC ではない)のいいところは、.NET Framework ベースの Windows アプリケーションの開発経験者には親しみやすいところです。

実際、自分の場合、HTML や JavaScript の知識が全くなかったのですが、Windows アプリケーションを作るときのように Visual Studio でサーバーコントロールをドラッグ&ドロップしてページに貼り付け、ウィザードを使ってプロパティを設定すれば、とりあえず動く Web アプリケーションは簡単に作成できました。

しかし、世の中の主流らしい PHP ベースの Web アプリケーションの開発者にとっては、サーバーコントロール、ポストバック、イベントドリブン、ビューステートなどの ASP.NET 固有の概念は馴染みにくいものだそうです。

それらが使えるから、ASP.NET(MVC ではない)には高い生産性があるのですが、その生産性を捨てても ASP.NET MVC を選ぶだけの理由があるかもしれないと期待しています。

ASP.NET(MVC ではない)の知識も十分でない自分が、余計なものに手を出すべきではないのかもしれませんけどね。

まぁ、Web アプリケーション開発でメシを食っているわけではない自分にとっては所詮趣味の問題に過ぎないので、自己満足でいいんです。(笑)

Tags:

MVC

クライアントコールバック

by WebSurfer 2011年4月2日 19:29

クライアント側のスクリプトによって、現在ブラウザに表示されているのと同じ URL に対して帯域外呼び出しを行い、その要求に従ってサーバー側で必要な処置を実行して、結果をクライアントに返すという、クライアントコールバックの話です。

クライアントコールバックの実行

今は、帯域外呼び出しの機能を自動化している ASP.NET AJAX Extensions の UpdatePanel などが利用できるので、この記事に書いたクライアントコールバックを実装する機会はないかもしれませんが、せっかくいろいろ調べて分かったことがありますので、備忘録として書いておきます。

ASP.NET クライアントコールバックは、XMLHttpRequest の必要な呼び出しをラッピングして独自の JavaScript API を提供してくれますので、開発者が帯域外呼び出しを実行するための JavaScript コードを自力で書く必要はありません。

代わりに、Page.ClientScript オブジェクトの GetCallbackEventReference メソッドを利用して、帯域外呼び出しを実行するために使用する JavaScript コードを生成します。このコードは、クライアント側のイベントハンドラに設定して利用します。

サーバー側では、ICallbackEventHandler インターフェイスの RaiseCallbackEvent が呼び出されて必要なサーバー側での処置が実行され、次にブラウザへのレスポンスが生成されるときに GetCallbackResult メソッドが呼び出されます。

上の画像を表示したコードをアップしておきます。画像は Callback ボタンをクリックしてコールバック前にクライアント側で実行されるスクリプト(例では alert)が実行されたところです。

alert ダイアログの OK ボタンをクリックするとコールバックがかかり、表示されている「コールバック前」という文字列が「クライアントからサーバーに渡した文字列 + サーバー側で追加した文字列」に書き換えられます。

<%@ Page Language="C#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
  // ICallbackEventHandler インターフェイスを実装し、
  // RaiseCallbackEvent メソッドを提供している必要がある。 
    
  private string returnValue;

  // サーバー側でコールバックを実行するためにこのメソッド
  // が呼び出される。
  public void RaiseCallbackEvent(string arg)
  {
    // 引数 arg にはクライアントスクリプト CallServer 
    // 関数の第一引数に設定した文字列が渡される。
    returnValue = arg + " + サーバー側で追加した文字列";
  }

  // コールバック結果をクライアントに返すメソッド。
  public string GetCallbackResult()
  {
    return returnValue;
  }

  protected void Page_Load(object sender, EventArgs e)
  {
    ClientScriptManager cm = Page.ClientScript;

    // サーバーに実際に要求を行うヘルパー関数。
    // この例では cbReference は以下のようになる。
    // WebForm_DoCallback('__Page',arg,
    //        ReceiveServerData,"",null,false);
    string cbReference = 
      cm.GetCallbackEventReference(this, "arg", 
        "ReceiveServerData", "");

    // サーバーに要求を行うクライアントスクリプト。
    // arg は RaiseCallbackEventメソッドの引数に渡さ
    // れる文字列。context はコールバック前にクライ
    // アント側で実行されるスクリプト。
    String callbackScript = 
      "function CallServer(arg, context) {"
          + cbReference + "; }";

    // この例では以下のクライアントスクリプトが登録
    // される。
    // function CallServer(arg, context) {
    //     WebForm_DoCallback('__Page',arg,
    //         ReceiveServerData,"",null,false);
    // } 
    cm.RegisterClientScriptBlock(this.GetType(),
        "CallServer", callbackScript, true);
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  <title>Client Callback</title>
  <script type="text/javascript">
  //<![CDATA[
    // クライアント コールバック関数
    // コールバック イベントを処理したサーバーコード
    // から呼び出され、結果を表す文字列を受け取る。
    function ReceiveServerData(arg, context) {
      // 2011/11/19 修正(下の追記参照)
      var element = document.getElementById("Message");
      if (typeof element.textContent != "undefined") {
        element.textContent = arg;
      } else {
        element.innerText = arg;
      }
    }

    var str = "クライアントからサーバーに渡した文字列";

    // コールバック前に実行するクライアントスクリプト
    function DoBeforeCallback() {
        alert('コールバック前に実行された alert');
    }
  //]]>
  </script>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <h1>Client Callback</h1>
    <input type="button" value="Callback" 
      onclick="CallServer(str, DoBeforeCallback());"/>
    <br />
    <span id="Message">コールバック前</span>
  </div>
  </form>
</body>
</html>

クライアントコールバックの問題は、クライアントとサーバー間の受け渡しが文字列に限定されていることです。文字列の内容は自由ですが、カスタムオブジェクトを受け渡したい場合はシリアル化と逆シリアル化は開発者が自力でコードを書かなければなりません。

というわけで、今後この方法を使うことはなさそうです。

------------ 2010/4/14 追記 ------------

この記事で紹介したコードを実際に動かして試せるよう 実験室 にアップしました。興味のある方は試してみてください。

------------ 2010/11/19 追記 ------------

Firefox では span id="Message" の「コールバック前」の文字列が書き換わらなかったので修正しました。修正したのは ReceiveServerData 関数の中身のコードです。

最初は、getElementById を使わず Message.innerText = arg; というようにしていたのが原因と思っていましたが、それだけが原因ではなくて、Firefox では innerText は使えないのでした。

Firefox では textContent を使うらしいです。ただし、これは IE では使えないのでtextContent を使えないブラウザがあるらしいので(IE では使えないという話がありますが IE9 は問題なかったです)、使えるか否かを判定して innerText と使い分ける必要があります。

加えて、コメントに「ここで定義せず GetCallbackEventReference メソッドの第 4 引数に設定することも可能。」と書いてあったのですが、これは間違っていたので削除しました。正しくは、第 4 引数はコールバック前に実行するクライアントスクリプトの文字列だったのです。(汗)

Tags:

AJAX

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年3月  >>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

View posts in large calendar