2
votes

Chaîne de connexion SQL Server non valide sur Linux Entity Framework Core

J'utilise Linux plus spécifiquement Xubuntu. J'ai installé SQL Server Express sur ma machine. Je suis actuellement en train de créer une application Web et ma connexion ne semble pas fonctionner ou je ne comprends pas tout bien?

Le résultat que j'obtiens est:

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 2.2.3-servicing-35854 initialized 'QuestionnaireDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: MigrationsAssembly=Migrations MigrationsHistoryTable=Migrations 
System.Data.SqlClient.SqlException (0x80131904): 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: 25 - Connection string is not valid) ---> System.Net.Sockets.SocketException (0x80004005): Success
   at System.Data.SqlClient.SNI.SSRP.GetPortByInstanceName(String browserHostName, String instanceName)
   at System.Data.SqlClient.SNI.SNIProxy.CreateTcpHandle(DataSource details, Int64 timerExpire, Object callbackObject, Boolean parallel)
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken)
   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.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.<>c__DisplayClass18_0.<Exists>b__0(DateTime giveUp)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.<>c__DisplayClass12_0`2.<Execute>b__0(DbContext c, TState s)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, Func`2 operation, Func`2 verifySucceeded, TState state)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, TState state, Func`2 operation)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Exists(Boolean retryOnNotExists)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Exists()
   at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_1.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:00000000-0000-0000-0000-000000000000
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: 25 - Connection string is not valid)

J'ai déjà essayé tout ce que j'ai pu trouver et rien n'a fonctionné. Cela peut être dû au manque d'informations pour les utilisateurs de Linux, mais je n'ai toujours pas pu le comprendre.

En général, j'essaye de me connecter à mon serveur SQL local en utilisant la chaîne de connexion dans ma console app utilisant EF core. Comme ça:

dotnet ef database update 0 --project Data --startup-project WebInterface

C'est la chaîne de connexion que j'utilise et qui devrait fonctionner.

J'utilise cette commande pour appliquer les migrations et créer le base de données sur mon serveur SQL:

internal const string CONNECTION_STRING =
            "Server = .\\SQLEXPRESS; Database = Questionnaires; Integrated Security = True";

Le message d'erreur complet que j'obtiens lorsque j'exécute la commande est le suivant:

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: 25 - Connection string is not valid)

Le résultat que je devrais obtenir est en fait d'appliquer toutes les migrations et de créer la base de données.


1 commentaires

Linux n'a pas le même concept de tubes nommés que Windows. Essayez d'utiliser une adresse IP plutôt qu'un canal nommé. De plus, Linux ne sait rien de la sécurité intégrée


3 Réponses :


0
votes

Essayez d'utiliser:

Server = .\\SQLEXPRESS

au lieu de:

Server = LOCALHOST\\SQLEXPRESS

Ce serait parce que les noms de serveur utilisent localhost comme serveur actuel alors que les chemins de fichiers utilisent . comme référence le dossier actuel.

Si cela ne fonctionne pas, assurez-vous que l'instance SQL Server est en cours d'exécution. Cela m'a fait trébucher à plusieurs reprises.


2 commentaires

La partie serveur de la chaîne de connexion ne concerne pas les dossiers, elle concerne les hôtes ou l'adresse IP où se trouve le serveur, ou sur Windows un canal nommé (pour la communication inter-processus)


@Tseng Oui, mais d'après la question, j'ai supposé qu'ils mélangeaient des dossiers et des noms de serveurs.



0
votes

Il semble que vous n'ayez pas fourni de nom complet pour le serveur de base de données.

écrivez la requête suivante sur votre serveur SQL et récupérez le nom de l'instance

SELECT @@servername

p>


1 commentaires

J'ai utilisé la requête et j'ai trouvé le nom du serveur, mais même avec lui, j'ai eu la même erreur.



4
votes

Linux a un concept différent de tubes nommés. . \\ SQLSERVER est un nommé notation pipe .

De plus, la sécurité intégrée ne fonctionnera pas sous Linux (au moins sans configuration, l'authentification Kerberos est prise en charge), car elle est liée à l'autorisation Active Directory / NTML.

Utilisez donc la chaîne de connexion d'autorisation de nom d'utilisateur standard standard:

Server=localhost;Database=myDataBase;User Id=myUsername;Password=myPassword;


2 commentaires

Vous vous êtes assuré que le serveur fonctionne réellement localement et écoute le port par défaut?


Vous aviez absolument raison. J'ai modifié le mauvais fichier pour la chaîne de connexion. Merci pour l'aide.