1

私は、c# と monotouch を使用して iphone プロジェクトに取り組んでいます。SQL Azure データベースを使用する必要があります。私の問題は、モノタッチを使用して接続できないように見えることです。Visual Studio 2012 を使用して、Windows 8 マシン上に構築されたネイティブ コンソール アプリケーションで以下のコードを正常に動作させることができます。私が得るエラーは次のとおりです。

System.NotImplementedException: クライアントとサーバー間で送信されるデータの SSL 暗号化が実装されていません。

少しグーグルで調べたところ、ここで私の正確な問題を説明していると思われるバグレポートが見つかりました。2年近く経っていることに気付いたので、これがまだ実装されていないかどうかはわかりません。

そこで、StringBuilder.Encrypt = true; の値を変更してみました。偽に。しかし、それでもクラッシュし、次のエラーが表示されます。

Mono.Data.Tds.Protocol.TdsInternalException: サーバーが接続を閉じました。---> System.IO.IOException: 接続が失われました

いずれの場合も、conn.Open(); のときにアプリがクラッシュします。と呼ばれます。

私はかなり行き詰まっており、SQL Azure を使用するしかありません。そのため、誰かが私の問題の解決策や回避策を提案できる場合は、大いに感謝します. 前もって感謝します!

        string userName = "<username>@<myservername>";
        string password = "<password>";
        string dataSource = "<myservername>.database.windows.net";
        string databaseName = "<dbname>";

        SqlConnectionStringBuilder connStringBuilder;
        connStringBuilder = new SqlConnectionStringBuilder();
        connStringBuilder.DataSource = dataSource;
        connStringBuilder.InitialCatalog = databaseName;
        connStringBuilder.Encrypt = true;
        connStringBuilder.TrustServerCertificate = false;
        connStringBuilder.UserID = userName;
        connStringBuilder.Password = password;


        using (SqlConnection conn = new SqlConnection (connStringBuilder.ToString())) {

            conn.Open();

            using (IDbCommand dbcmd = conn.CreateCommand()){
                string sql = "Select client_username from dbo.client;";
                dbcmd.CommandText = sql;
                using (IDataReader reader = dbcmd.ExecuteReader()){
                    while( reader.Read() ){
                        string username = (string) reader["client_username"];
                    }
                }
            }
        }
4

2 に答える 2

3

SqlConnection クラスの SSL は実装されていません。SqlConnection.csを参照してください

また、Azure は暗号化された接続を必要とするため、何らかの回避策を講じる必要があります。たとえば、Web ロールを作成して、ユーザーに代わって SQL を実行する Web サービスを公開できます。

于 2013-05-04T22:22:34.853 に答える
0

接続文字列として単純な文字列を使用してみてください。

        connStr = "Server=tcp:<server_here>.database.windows.net,1433;Database=<db_name_here>;Trusted_Connection=False;Encrypt=True;TrustServerCertificate=False;UserID=<user_name_here>@<server_name_here>;Password=<password_here>";

        using (SqlConnection conn = new SqlConnection (connStr)) {

            conn.Open();

            using (IDbCommand dbcmd = conn.CreateCommand()){
                string sql = "Select client_username from dbo.client;";
                dbcmd.CommandText = sql;
                using (IDataReader reader = dbcmd.ExecuteReader()){
                    while( reader.Read() ){
                        string username = (string) reader["client_username"];
                    }
                }
            }
        }

違いに注意してください - サーバー、データベースを使用してください。接続文字列を正しく取得したら、ConnectionStringBuilder を使用して、まったく同じ出力が得られるかどうかを確認できます。しかし、機能する文字列があれば、文字列を使用する方が簡単です。

于 2012-12-28T21:47:08.037 に答える