【问题标题】:Has anyone successfully run a SQL Server connector within a C# AWS Lambda function, or AWS Linux EC2 instance?有没有人在 C# AWS Lambda 函数或 AWS Linux EC2 实例中成功运行 SQL Server 连接器?
【发布时间】:2016-12-20 11:49:06
【问题描述】:

我一直在努力尝试从 Lambda 函数或 AWS Linux EC2 实例获取 SQL Server 连接,但没有成功。

我首先让 .NET Core 在 Windows 中运行,并使用 System.Data.SqlClient 在其中成功地进行写入/查询。然后我尝试将其移动到 AWS Lambda 函数中。库似乎没有任何问题,而是在尝试打开数据库连接时总是出现此错误:

未处理的异常:System.Data.SqlClient.SqlException:A 建立时发生与网络相关或特定于实例的错误 到 SQL Server 的连接。未找到或未找到服务器 无障碍。验证实例名称是否正确以及 SQL 服务器配置为允许远程连接。 (提供者:TCP 提供程序,错误:40 - 无法打开与 SQL Server 的连接)

然后我决定让相同的代码在 Ubuntu Linux (16.04) 中运行,并且能够成功地将数据写入/查询到那里的 SQL Server 数据库。接下来,我尝试在 AWS Linux AMI 中运行完全相同的代码(因为这些是 AWS Lambda 运行的平台),并收到了与上面完全相同的错误代码。然后我尝试使用 Entity Framework 试一试,得到了完全相同的错误。

有没有人成功做到这一点?如果是这样,我很想听到更多关于你的具体方法的信息。或者,还有人知道这是否可能吗?

我将在下面粘贴代码 sn-p,即使我不认为这是问题所在(相同的代码在 Ubuntu 中有效,但在 AWS Linux 中无效)。注意:这是一个模拟数据库,只是为了测试。这似乎是驱动程序的问题,但很难确定。

using System;
using System.IO;
using System.Data.SqlClient;

namespace CSharpLambdaFunction
{
    public class Program
    {
        public static void Main() {
            LambdaHandler.myHandler();
        }
    }

    public class LambdaHandler
    {
        public static void myHandler()
        {
            SqlConnection myConnection = new SqlConnection("user id=usernamehere;" +
                                        "password=passwordhere;server=serveraddresshere;" +
                                        "database=test; " +
                                        "connection timeout=30");
            try
            {
                myConnection.Open();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
            int secondsSinceEpoch = (int)t.TotalSeconds;

            SqlCommand myCommand = new SqlCommand("INSERT INTO dbo.Table_1 (test1, test2) " +
                                        "Values ('testing', " + secondsSinceEpoch + ")", myConnection);
            myCommand.ExecuteNonQuery();

            try
            {
                SqlDataReader myReader = null;
                myCommand = new SqlCommand("select * from dbo.Table_1",
                                                            myConnection);
                myReader = myCommand.ExecuteReader();
                while (myReader.Read())
                {
                    Console.WriteLine(myReader["test1"].ToString());
                    Console.WriteLine(myReader["test2"].ToString());
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

【问题讨论】:

  • 我认为您的 sql 服务已停止??
  • 不,绝对不是。我可以再次在 Ubuntu 中运行代码并获得良好的结果,无论是在 AWS Linux 中尝试之前还是之后。
  • 啊,这是我用来测试服务器通信的 SQL Server EC2 实例的入站流量问题!上面的代码是功能性的。

标签: c# sql-server amazon-web-services lambda


【解决方案1】:

我发现问题在于 EC2 SQL Server 实例没有正确的入站规则!上面的代码是功能性的。仅用于示例目的,请参见下面的相应 project.json:

{
  "version": "1.0.0-*",
  "dependencies": {},
  "buildOptions": {
    "warningsAsErrors": true,
    "emitEntryPoint": true
  },
  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.1"
        },
        "System.Data.SqlClient": {
          "version": "4.1.0-*"
        }
      },
      "imports": "dnxcore50"
    }
  }
}

【讨论】:

    猜你喜欢
    • 2019-11-10
    • 2020-09-29
    • 2018-03-24
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2022-12-18
    相关资源
    最近更新 更多