2016-07-29 99 views
3

我有一个连接到SQL Server数据库的控制台应用程序(托管在同一网络中的专用win计算机上),使用.Net核心编写(使用Visual Studio Code),它在Windows上工作得非常好。在Ubuntu/Visual Studio上从.Net Core连接到SqlServer代码

在Ubuntu上运行Visual Studio代码的代码库无法连接到SQL Server实例,说它无法找到服务器。

我可以ping通SQL Server IP并从中获得响应。

另外我可以使用1433端口上的telnet连接到SQLServer实例。

另外,我也按照建议从nuget中提取了System.Data.Common和System.Data.SqlClient,并在建议的连接字符串中设置了MultipleActiveResultSets = False。

只是为了保持完整性,这是试图连接代码:

var connection = new SqlConnection(myConnectionString); 
connection.Open(); 

这是堆栈跟踪:

Unhandled Exception: System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 35 - An internal exception was caught) ---> System.AggregateException: One or more errors occurred. (No such device or address) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address 
    at System.Net.Dns.HostResolutionEndHelper(IAsyncResult asyncResult) 
    at System.Net.Dns.EndGetHostAddresses(IAsyncResult asyncResult) 
    at System.Net.Dns.<>c.<GetHostAddressesAsync>b__14_1(IAsyncResult asyncResult) 
    at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization) 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Data.SqlClient.SNI.SNITCPHandle.<ConnectAsync>d__22.MoveNext() 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 
    at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 
    at System.Threading.Tasks.Task.Wait(TimeSpan timeout) 
    at System.Data.SqlClient.SNI.SNITCPHandle..ctor(String serverName, Int32 port, Int64 timerExpire, Object callbackObject, Boolean parallel) 
    --- End of inner exception stack trace --- 
    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling) 
    at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) 
    at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) 
    at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
    at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
    at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) 
    at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
    at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) 
    at System.Data.SqlClient.SqlConnection.Open() 

任何想法?

感谢

+0

你的连接字符串是什么样的?您是否使用SQL身份验证?如果您的连接字符串正在使用Windows身份验证而不是SQL身份验证,那么您可能会遇到问题。 –

+0

我正在使用SQL身份验证。 “SERVERIP \\ MSSQLSERVER,1433; Database = DBName; User = UIsername; Password = password; MultipleActiveResultSets = False” –

回答

0

显然,作为SQL Server是目前Windows计算机上,它是不是有你的Ubuntu机器上。它不能安装在Ubuntu机器上。即使出于测试目的,您也必须将其托管在数据库服务器上,并将连接字符串指向该连接字符串。

编辑
尝试确保您的数据库服务器的防火墙不阻止访问。即使你在同一台电脑上有双启动,他们仍然是两台不同的电脑机器。

+0

对不起,我应该指定。我已经连接到远程托管的数据库服务器(仍在局域网和专用的赢机器上)。正如我在问题中提到的,我可以ping SQL Server计算机,并从中获得响应。 –

+0

然后检查你的数据库服务器防火墙规则。 –

+0

从Ubuntu连接时为什么应该改变?当我在Windows上运行我的应用程序时,我可以从我的机器进行连接。 (我在我的机器上有双启动) –

5

我发现这个问题,它已经成为coreclr回购中的一个问题。问题是我连接到的SQLServer实例版本。它是2008r2 SP1和.net核心sql客户端无法连接到它。升级到SP3可以修复它。

More details here