【问题标题】:accesing azure database from azure function从 azure 函数访问 azure 数据库
【发布时间】:2019-06-27 08:37:12
【问题描述】:

我想从 Xamarin 访问一个数据库,看起来一个不错的方法是创建一个 azure 数据库(暂时免费)

所以我在 azure 中创建了一个帐户,我创建了一个 DBSQLServer 和一个 SQLDataBase,我设置了管理员用户和密码,并在此过程中打开了防火墙。

然后我在 VS 2019 中创建了一个具有 azure 函数的项目,创建了一个仅在 OkObjectResult 中返回一个字符串的函数,并且它可以工作(访问本地 url 和公共(发布后))。 然后我安装了 System.Data.SqlClient Nuget 包,然后尝试像这样连接到数据库 usign 管理员用户和密码:

//did not use "new line"'s in the actual code, included them here for readability. 
using (SqlConnection conn = 
       new SqlConnection("
          Server=tcp:javrsserver.database.windows.net,
          1433;
          Initial Catalog=JaviRS;
          Persist Security Info=False;
          User ID={javirs};Password={-The one set in the azure portal-};
          MultipleActiveResultSets=False;
          Encrypt=True;
          TrustServerCertificate=False;
          Connection Timeout=30;"))
{
   try{
      conn.Open();
   }catch (Exception exc)
   { 
      //here I collect "Login failed for user {javirs}"
      //evntID : 18456
   }
}

理论上只是密码错误,但我很确定密码没问题。所以我想更多的是关于用户帐户控制的一些 Windows 奇怪的东西......

有什么线索吗??

PS:如果有一种更简单的方法可以将简单的 sql 放入我的 Xamarin 应用程序中......我也很感兴趣。这个 Azure 的东西是我需要的过度工程,而且不是永远免费的..


编辑:

我尝试在 Visual Studio 中使用 SQLServver 对象资源管理器进行连接,输入了与我在连接字符串中输入的凭据相同的凭据,它确实允许我进入..

【问题讨论】:

  • 本地存储不是 SQLLite 吗?我正在尝试做在线共享数据库
  • 是的,但你没有在你的问题中提到这一点。所以你想要一个云数据库? Azure 作为解决方案有什么问题?
  • 你能分享你的错误吗?我已经测试过只需要您的错误详细信息。是否要将函数中的数据插入 azure sql db?
  • 错误发生在 conn.Open() 上,异常消息是我写的“用户 {javirs} 登录失败”。有一个包含 5 个字段的数据字段,唯一一个看起来相关的是代码 18546。我搜索了一下,与登录失败有关。我还可以看到状态 1(没有额外的细节)。是的,我想通过这些功能在数据库上实现 CRUD.. 是的

标签: sql-server azure xamarin azure-sql-database


【解决方案1】:

我已经完成了以下步骤:

Azure Sql 脚本:

CREATE TABLE AzureSqlTable(
    [Id] [int] PRIMARY KEY IDENTITY(1,1) NOT NULL,
    [FirstName] [nvarchar](max) NULL,
    [LastName] [nvarchar](max) NULL,
    [Email] [nvarchar](max) NULL,
)
GO

函数类:

  public class AzureFunctionV2SqlTableClass
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string DbOperationType { get; set; }

    }

Azure 函数体:

[FunctionName("FunctionV2SqlConnectionExample")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            //Read Request Body
            var content = await new StreamReader(req.Body).ReadToEndAsync();

            //Extract Request Body and Parse To Class
            AzureFunctionV2SqlTableClass objFuncV2Sql = JsonConvert.DeserializeObject<AzureFunctionV2SqlTableClass>(content);

            // variable for global message.
            dynamic validationMessage;


           // Validate param because, I am checking here.

            if (string.IsNullOrEmpty(objFuncV2Sql.FirstName))
            {
                validationMessage = new OkObjectResult("First Name is required!");
                return (IActionResult)validationMessage;
            }
            if (string.IsNullOrEmpty(objFuncV2Sql.LastName))
            {
                validationMessage = new OkObjectResult("Last Name is required!");
                return (IActionResult)validationMessage;
            }

            if (string.IsNullOrEmpty(objFuncV2Sql.Email))
            {
                validationMessage = new OkObjectResult("Email is required!");
                return (IActionResult)validationMessage;
            }

            //Read database Connection

            var sqlConnection = "Data Source =tcp:sqlserverInstancenNameFromAzurePortal.database.windows.net,1433;Initial Catalog=YouDbName;Persist Security Info=False;User ID=ServerUserName;Password=ServerPass;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;";

            //Sql Execution Message varible
            dynamic sqlExecutionMessage;
            //Define Db operation Type
            if (objFuncV2Sql.DbOperationType.ToUpper() == "INSERT")
            {
                using (SqlConnection conn = new SqlConnection(sqlConnection))
                {
                    conn.Open();
                    var text = "INSERT INTO AzureSqlTable VALUES ('" + objFuncV2Sql.FirstName + "', '" + objFuncV2Sql.LastName + "', '" + objFuncV2Sql.Email + "') ";

                    using (SqlCommand cmd = new SqlCommand(text, conn))
                    {
                        sqlExecutionMessage = await cmd.ExecuteNonQueryAsync();
                    }
                    conn.Close();
                }

                validationMessage = new OkObjectResult(sqlExecutionMessage + " ROW INSERTED");
                return (IActionResult)validationMessage;
            }
            //As we have to return IAction Type So converting to IAction Class Using OkObjectResult We Even Can Use OkResult
            var result = new OkObjectResult("Operation Falid! No Relevant Command Found!");
            return result;
        }

需要参考:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Net.Http;
using System.Data.SqlClient;

我使用的 Nuget 包:

System.Data.SqlClient(4.6.1)

从 Nuget 包管理器下载。请参阅下面的屏幕截图:

邮递员样本:

{
    "FirstName": "Kiron New Sql FunctionV2",
    "LastName":"Kiron New Local Sql",
    "Email":"KironTest@microsoft.com",
    "DbOperationType":"INSERT"
}

要记住的要点:

  1. 按照我在这里尝试演示的内容进行操作,没有工程 在让它运行之前

  2. 只需使用您的Azure Sql Server Credentials 更新连接字符串

  3. 从密码中删除 {},因为我没有在我的示例中指定它 此外,当您从包含的门户中复制连接字符串时 {password} 只需省略 {}
  4. 如果您的函数遇到来自Azure Portal SQL Db 的错误 关于您的客户端 IP 地址。在这种情况下,只需添加您的客户 如下 IP:

步骤:1

步骤:2

注意:我刚刚尝试显示插入操作。希望它会相应地工作。

【讨论】:

  • 你在哪里设置了 User ID=ServerUserName;Password=ServerPass 在连接字符串中??
  • 这两个是来自azure SQL Db的用户登录Id和Pass。 See here。你也可以在local.settings.json上设置,总之我刚刚展示了
  • 我将 ServerUserName 和 ServerPass 与授予我访问 SQL 数据库编辑器的权限交换。我在 Visual Studio 的 SQLServer 对象编辑器中输入的也是相同的。仍然..当我尝试运行我得到“用户'{javirs}'登录失败”的东西时
  • 检查您的 azure sql 服务器是否允许您使用此凭据。似乎这是您的服务器问题。尝试创建一个新的。
  • 只需从您的 azure 门户 sql 复制连接字符串并替换您的 azure sql 用户名和密码,如评论屏幕截图所示。
【解决方案2】:

错误提示:“用户 {javirs} 登录失败”

这表明您将 {} 包含在您的用户名中(并且可以证明包含在您的密码中。删除 { 和 } 就可以解决问题。

现在可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2021-09-17
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2021-06-28
    相关资源
    最近更新 更多