by WebSurfer
2014年11月24日 17:10
Visual Studio 2010 Professional 上で MySQL と SqlDataSource を使って ASP.NET Web Forms アプリを作った時に遭遇した問題を書きます。
なお、使ったのは 3 年以上前にインストールした MySQL Community Server 5.5.11 と Connector/Net 6.3.6 ですので、最新版では様子が違うかもしれません。ご注意ください。
問題は、簡単に書くと、Visual Studio の「データソースの構成」ウィザードを使ってクエリを自動生成すると、識別子がスクエアブラケット( [ ] )で囲まれますが、それが MySQL では使えないので、上の画面のようなエラーが出るということです。
具体的な再現手順を書くと、(1) Visual Studio のデザイン画面で SqlDataSource の > 印をクリック、(2) 表示される「SqlDataSource タスク」メニューの中の[データ ソースの構成...]をクリック、(3) ウィザードの「Select ステートメントの構成」画面で[テーブルまたはビューから列を指定します(T)]を選択、(4) 次の画面「クエリのテスト」に進んでテストを実行、(5) 上の画面のようなエラーが出る・・・ということです。
上のエラーメッセージで、テーブル名 employees がスクエアブラケット( [ ] )で囲まれているのが分かるでしょうか? ちなみに、ウィザードで生成されたソースは以下のようになります。(注:この例では列に * を選択しています。実際の列を指定すると列名もスクエアブラケットで囲まれます)
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:MySQL %>"
ProviderName="<%$ ConnectionStrings:MySQL.ProviderName %>"
SelectCommand="SELECT * FROM [employees]">
</asp:SqlDataSource>
もちろんこの状態で実行しても以下のようにサーバーエラーになります。
解決策は、生成されたソースのクエリからスクエアブラケットを削除するか、スクエアブラケットに換えてバッククォート( ` )で囲むことです(識別子が予約語と同じ、または特殊文字を含む場合)。
または、上の再現手順の (3) のステップで[カスタム SQL ステートメントまたはストアド プロシージャを指定する(S)]を選んで、自力でクエリを組み立ててもいいです。
ただし、SELECT だけならそれでもいいですが、INSERT, DELETE, UPDATE も必要な場合は少々面倒です。
Visual Studio のデータスース構成ウィザードを使って型付 DataSet + TableAdapter を作った場合は、識別子は正しくバッククォート( ` )で囲まれ上記のような問題はありませんので、それと ObjectDataSource を組み合わせて使う方が良さそうです。