有没有人在C#AWS Lambda函数或AWS Linux EC2实例中成功运行SQL Server连接器?

时间:2016-12-20 11:49:06

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

我一直在努力工作,试图从Lambda函数或AWS Linux EC2实例获取SQL Server连接而没有运气。

我开始在Windows中运行.NET Core并使用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进行尝试并得到完全相同的错误。

有没有人成功这样做?如果是这样,我希望能够更多地了解您的具体方法。或者,也有人知道这是不可能的吗?

我会粘贴下面的代码片段,即使我不相信这是问题(相同的代码在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());
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我发现问题是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"
    }
  }
}