none
SmartDeviceプロジェクト (VB.net) から AZURE SQLへのアクセスができない RRS feed

  • 質問

  • お世話になります。

    SmartDeviceプロジェクト から AZURE SQLへのアクセスができません。
    (PDA上の組み込みアプリケーションを開発しています。)

    IDE: VisualStudio2008
    ドライバ:  System.Data.SqlClient
    ※AZURE SQL 側で IPアドレス制御はかけておらず、全て開放。
    ※SmartDeviceプロジェクト ではない、普通のWinowsFormアプリケーションからの接続には成功しています。

     現象:System.Data.SqlClient のConnectionをOpenしようとすると、Database doesn't exist or access denied
        とのエラーメッセージがでる。

    接続文字列の  Datasource=[xxxxxxx,1433]という名前引きでの記述がよくないのかと思い、
               Datasource=[n.n.n.n,1433]  というIPアドレス引きに変えたが、変わらず。

    なお、デバイスのほうのOSはWindowsCompactEmbeded7 でして、このデバイスから
    上記AZURE SQLへのPingもIPアドレス引きで打ってみましたが、失敗しました(インターネット接続は確認したうえで)。

    どのように現象を切り分けたらいいのか、ご教示いただけますでしょうか?
    よろしくお願いいたします。


    2018年11月29日 8:13

回答

  • FELIKKSさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信が遅くなりまして申し訳ございません。

    私が知る限り、WindowsCompactEmbeded7は以前はシステムでした。
    Microsoft .net Compact framework (.net CF) は、パーソナルデジタルアシスタント (PDA) などのリソースが制限されたモバイル/組み込みデバイス上で実行するように設計された .Net Framework のバージョンであり、既に長い時間前にありました (約 3.5)。
    Azureプラットフォームは、現在急成長中の新興テクノロジーです。 Azureデータベースへの接続の以前のバージョン(.NET Compact Framework)に問題があります(最新のコンポーネントとメンテナンスの欠如)。

    現在、Azure SQL データベースに接続してクエリを行うには、通常次の方法を使用します。
    1:プロジェクトのソリューションエクスプローラでプロジェクトを右クリックし、[Manage NuGet Packages]をクリックします。

    2:[参照]タブで、System.Data.SqlClientを検索してインストールします。

    3:データベースとアクセスデータベースのリソースを接続します。
                    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
                    builder.DataSource = "your_server.database.windows.net"; 
                    builder.UserID = "your_user";            
                    builder.Password = "your_password";     
                    builder.InitialCatalog = "your_database";

                    using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
                    {
                        connection.Open();       
                        StringBuilder sb = new StringBuilder();
                        sb.Append("SELECT TOP 20 pc.Name as CategoryName, p.name as ProductName ");
                        sb.Append("FROM [SalesLT].[ProductCategory] pc ");
                        sb.Append("JOIN [SalesLT].[Product] p ");
                        sb.Append("ON pc.productcategoryid = p.productcategoryid;");
                        String sql = sb.ToString();

                        using (SqlCommand command = new SqlCommand(sql, connection))
                        {
                        }                    
                    }

    Quickstart: Use .NET (C#) with Visual Studio to connect and query an Azure SQL database
    注:System.Data.SqlClientページには、いくつかの依存関係が必要であることがわかります。これらの依存関係は、.Net Compact Framework のバージョンよりも新しいものです。

    そのため、従来の .Net Compact Framework コンポーネントを使用して、Azure SQL Server にアクセスすることはお勧めしません。

    次のソリューションを使用して、プロジェクトの開発を続行することを検討できます。

    1: 中間サービスコンポーネントを作成します。

    -> Web API

    -> Web サービス

    2: Azure REST API

    Azure REST API を使用してデータベースに接続し、データベースリソースにアクセスすることができます。これは予想と提案です。詳細なヘルプについては、Azure フォーラムを参照してください。

    どうぞよろしくお願いします。


    ~ 参考になった投稿には回答としてマークの設定にご協力ください ~
    MSDN Community Support Haruka

    • 回答としてマーク FELIKKS 2018年12月11日 0:29
    2018年12月10日 0:55
    モデレータ

すべての返信

  • FELIKKSさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    上記の件つきまして、ファイアウォールに関連するIPを追加するかどうかをご確認いただけますでしょうか。次の手順を確認し、問題がないかどうかを確認してください。
    1.[データベースの概要] ページでサーバーレベルのファイアウォールルールを設定するには、ツールバーの [サーバーファイアウォールの設定] をクリックします。 SQL データベースサーバーの [ファイアウォールの設定] ページが開きます。
    2.ツールバーの[クライアントIPの追加]をクリックして、現在使用しているコンピュータのIPアドレスを追加し、[保存]をクリックします。 現在のIPアドレスに対して、サーバーレベルのファイアウォールルールが作成されます。

    詳細については、以下を参照してください。
    https://docs.microsoft.com/en-us/azure/sql-database/sql-database-firewall-configure#from-database-overview-page

    どうぞよろしくお願いします。


    ~ 参考になった投稿には回答としてマークの設定にご協力ください ~
    MSDN Community Support Haruka

    2018年12月3日 1:53
    モデレータ
  • 返信ありがとうございます。

    ただ、お書きした通り、 
       ※AZURE SQL 側で IPアドレス制御はかけておらず、全て開放。
    となっています。つまり、ファイアウォールの制御は  0.0.0.0~255.255.255.255 と
    いうルールを設けてある状態です。
     また、通常のWindowsPCからの接続(WindowsFormアプリケーション)は
    問題なくできることが確認できた状態でして、その上で、ハンディ端末上からは
    (SmartDeviceProjectのアプリケーションからは
    アクセスできない、というのが今の現状です。

    よろしくお願いいたします。

    2018年12月3日 8:46
  • FELIKKSさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信くださいましてありがとうございます。

    ご返信によると、ご使用した接続文字列によって問題が引き起こたようです。
    Azure SQLデータベースの場合、ADO.NETの接続文字列は以下のようになります。
    Server=tcp:xxxx.database.windows.net,1433;Initial Catalog=xxxx;Persist Security Info=False;User ID={your_username};Password={your_password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
    AzureポータルのSQLデータベースの左のタブ「接続文字列」でそれを見つけることができます。それを確認し、正しく使用されているかどうかを確認してください。
    一方、セキュリティと並行性を考慮すると、デバイスから直接SQLデータベースに接続することはお勧めしません。 
    Azure WebAppsや関数などを使用してデータベースにアクセスするため、REST APIをいくつか公開するのがベストプラクティスです。
    その後、接続文字列のリークを避けるために、SQLデータベースと安全に分離されたHttpWebRequestを使用して呼び出すことができます。

    どうぞよろしくお願いします。


    ~ 参考になった投稿には回答としてマークの設定にご協力ください ~
    MSDN Community Support Haruka

    2018年12月4日 8:53
    モデレータ
  • ご返信ありがとうございます。


    私の間違いでしたらご容赦いただきたいのですが、
     お書きになった接続文字列の記述形式は  ADO.netのドライバのうち、 System.Data.OleDb  に適合するもの
    なのではないでしょうか?
     こちらで開発しているのは WindowsCE7のスマートデバイスアプリケーションなので、
     System.Data.OleDb ではなく、  System.Data.SqlClient を使わざるを得ない状況となっています。

    System.Data.SqlClient の接続文字列は:

     data source=xxxxx;initial catalog=xxxxx;user id={ID};password={PW};persist security info=True

    とならなくてはいけなく、上記の記述をしてしまうと実行時エラーになるものと認識してます。

     なお、AWS上のSQLServer(ExpressEdition )では問題なくスマートデバイスからの接続に成功しました。
    同様のことがなぜSQLAzureになるとできないのか、どうにか要因をつきとめられたら、と思っています。

    2018年12月5日 10:09
  • FELIKKSさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信が遅くなりまして申し訳ございません。

    私が知る限り、WindowsCompactEmbeded7は以前はシステムでした。
    Microsoft .net Compact framework (.net CF) は、パーソナルデジタルアシスタント (PDA) などのリソースが制限されたモバイル/組み込みデバイス上で実行するように設計された .Net Framework のバージョンであり、既に長い時間前にありました (約 3.5)。
    Azureプラットフォームは、現在急成長中の新興テクノロジーです。 Azureデータベースへの接続の以前のバージョン(.NET Compact Framework)に問題があります(最新のコンポーネントとメンテナンスの欠如)。

    現在、Azure SQL データベースに接続してクエリを行うには、通常次の方法を使用します。
    1:プロジェクトのソリューションエクスプローラでプロジェクトを右クリックし、[Manage NuGet Packages]をクリックします。

    2:[参照]タブで、System.Data.SqlClientを検索してインストールします。

    3:データベースとアクセスデータベースのリソースを接続します。
                    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
                    builder.DataSource = "your_server.database.windows.net"; 
                    builder.UserID = "your_user";            
                    builder.Password = "your_password";     
                    builder.InitialCatalog = "your_database";

                    using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
                    {
                        connection.Open();       
                        StringBuilder sb = new StringBuilder();
                        sb.Append("SELECT TOP 20 pc.Name as CategoryName, p.name as ProductName ");
                        sb.Append("FROM [SalesLT].[ProductCategory] pc ");
                        sb.Append("JOIN [SalesLT].[Product] p ");
                        sb.Append("ON pc.productcategoryid = p.productcategoryid;");
                        String sql = sb.ToString();

                        using (SqlCommand command = new SqlCommand(sql, connection))
                        {
                        }                    
                    }

    Quickstart: Use .NET (C#) with Visual Studio to connect and query an Azure SQL database
    注:System.Data.SqlClientページには、いくつかの依存関係が必要であることがわかります。これらの依存関係は、.Net Compact Framework のバージョンよりも新しいものです。

    そのため、従来の .Net Compact Framework コンポーネントを使用して、Azure SQL Server にアクセスすることはお勧めしません。

    次のソリューションを使用して、プロジェクトの開発を続行することを検討できます。

    1: 中間サービスコンポーネントを作成します。

    -> Web API

    -> Web サービス

    2: Azure REST API

    Azure REST API を使用してデータベースに接続し、データベースリソースにアクセスすることができます。これは予想と提案です。詳細なヘルプについては、Azure フォーラムを参照してください。

    どうぞよろしくお願いします。


    ~ 参考になった投稿には回答としてマークの設定にご協力ください ~
    MSDN Community Support Haruka

    • 回答としてマーク FELIKKS 2018年12月11日 0:29
    2018年12月10日 0:55
    モデレータ
  • ありがとうございます。
    ひとまず、現状は理解しました。

    一旦、回答としてマークさせて頂きます。

    2018年12月11日 0:29