【发布时间】: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