1

我正在使用 c# 和 monotouch 开发一个 iphone 项目。我需要使用 SQL Azure 数据库。我的问题是我似乎无法使用单点触控连接。我可以使下面的代码在使用 Visual Studio 2012 构建在 Windows 8 机器上的本机控制台应用程序中正常工作。但是,当我尝试将其移植到 imac 并使用 monodevelop/monotouch 时,我的 iphone 应用程序崩溃了。我得到的错误是:

System.NotImplementedException:未实现客户端和服务器之间发送的数据的 SSL 加密。

我用谷歌搜索了一下,发现了一个错误报告,似乎在这里描述了我的确切问题。我注意到它已经快两年了,所以我不确定这是否仍然没有实现。

因此,我尝试更改 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 回答