8
votes

SQL Server CLR Integration prend-il en charge les fichiers de configuration?

J'utilise l'intégration SQL Server CLR pour créer un assemblage.

Commande de charge: Créer un ensemble TCPCLR à partir de 'g: \ tcpclrtest.dll' avec permission_set = dangereux

sans app.config

Le code DLL contient: String IP = ConfigurationManager.AppSettings ["Connexion"]. Tostring ();

aussi l'app.config contient:

Mais lorsque j'exécute la procédure, le serveur SQL affiche une erreur system.nullreferenceException

Est-ce que SQL Server CLR Integration prend en charge les fichiers app.config?


0 commentaires

4 Réponses :


3
votes

Vous obtiendrez évidemment un NullReferenceException car ConfigurationManager.appsettings ["Connexion"] renvoie NULL, puis vous appelez Tostring () sur un null. < / p>

jusqu'à ce que vous avez posté votre question, la page de classement de la part d'une recherche Google sur CLR Integration app.config était-ce Utilisation d'une configuration d'application (app.config / web.config) fichier dans l'intégration CLR Server SQL Server .

dans l'article associé de Jonathan Kehayias < / a>, dit-il

Une partie commune de la programmation dans .NET est d'utiliser un fichier de configuration Pour stocker des informations de configuration dans un emplacement facilement modifiable. Le fichier app.config ou web.config est une inclusion inestimable dans la plupart des Les projets et les développeurs .NET peuvent avoir besoin de conserver cette fonctionnalité. dans le cadre du partage logique entre les objets de la base de données et la application aussi. Le problème est que SQL CLR n'autorise pas l'utilisation de La classe System.Configuration dans les projets SQLCLR .

Il continue ensuite à détailler une solution de contournement qui implique d'éditer le fichier de projet pour injecter une nouvelle clé dans un groupe d'éléments qui relie votre app.config au projet. À partir de là, vous pouvez faire une certaine Wrangling Basica de votre code pour créer une fonction de réflexion pour renvoyer la chaîne de connexion ou l'appSeting dont vous avez besoin.

Vous êtes préférable de lire l'article posté par lui à l'URL susmentionnée, car ce n'est pas ma région et je finirais simplement à plagier de manière flagrante de son contenu pour donner une étape à l'étape de la façon de faire.


2 commentaires

Vous pouvez utiliser system.configuration tout ce que vous voulez; Obtenez explicitement une via ConfigurationManager.opénexeconfiguration () . Les méthodes statiques ConfigurationManager ne fonctionnent évidemment pas, mais la partie Bold de la déclaration est inexacte. La seule astuce consiste à déterminer l'emplacement de l'app.config, et c'est là que SQL CLR joue "astuces" car le appdomain obscurcit toutes les informations de localisation de par exemple. assemblage.getexecutingassemblage () . Toutefois, si vous pouvez utiliser un chemin fixe pour localiser votre app.config, vous êtes gratuitement à la maison! Seuls les autres détails n'utilisent pas les méthodes statiques de CM.


Vous n'avez pas inclus le code et maintenant le lien est en panne. C'est ce qui arrivera toujours avec des réponses de liaison.



13
votes

Vous devez placer un fichier sqlservr.exe.config struds> dans le dossier \ binn strong> du dossier racine de ce cas. Par exemple:

C: \ Program Files \ Microsoft SQL Server \ mssql11.msqlserver \ msql \ binn strong> p>

Si vous utilisez SQL Server 2008 R2 (SP1) ou plus récent , vous devriez être capable de trouver l'emplacement exact via la requête suivante, qui affiche le chemin complet de sqlservr.exe strong>: p> xxx pré>

dans votre code , vous avez besoin de cette ligne en haut: p> xxx pré>

, puis cela fonctionnera: p> xxx pré>

contenu de la SQLSERVR.EXE.CONFIG STRT> Fichier: P>

IF (EXISTS(
    SELECT  sd.*
    FROM    sys.databases sd
    WHERE   sd.[name] = DB_NAME() -- or N'name'
    AND     sd.[is_trustworthy_on] = 0
   ))
BEGIN
    PRINT 'Enabling then disabling TRUSTWORTHY...';
    ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
    ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
END;
ELSE
BEGIN
    PRINT 'Disabling then enabling TRUSTWORTHY...';
    ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
    ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
END;


8 commentaires

Oui, je veux juste faire des connexions TCP à d'autres machines. Le nom du fichier de configuration doit être SQLSERVR.EXE.CONFIG ? doit être modifié en , non?


@ZHENGKANG OUI, c'est le nom du fichier car il correspondra à l'exécutable sqlservr.exe dans ce même dossier. Je crois que vous peut avoir une section appsettings , mais je reçois une erreur lors de la tentative de tirer la valeur d'une clé particulière. D'autre part, j'ai réussi à obtenir la section Connections à lire sans problème. Vous pouvez essayer les deux, mais je ne pouvais prouver que (à ce stade) que l'un d'entre eux a définitivement travaillé.


Merci, j'ai fait comme vous l'avez dit, ça réussit. Vous vous suggérez de changer dangereux à external_access , mais le code DLL a un statique var à sotre une valeur obtenir de dB, external_access < / code> ne peut pas être autorisé, donc je choisis dangereux


@ZHENGKANG content que cela a travaillé. Concernant dangereux , découvrez ce que j'ai recommandé ici: Stackoverflow.com/questions/28179038/... Peut-être que cela fonctionnera pour vous. Ça vaut la peine d'essayer.


@zhengkang Veuillez consulter la mise à jour que je viens de poster liée à la rafraîchissement du fichier de configuration pour obtenir les modifications. Les méthodes de rechargement que j'avais mentionnées sont toutes inutiles car j'ai trouvé une méthode très simple et appropriée.


Merci beaucoup. Maintenant, j'ai un autre problème à propos de Connections TCP.Ceuds-tu me donner des suggestions? http://stackoverflow.com/questions/28230475/socket-Communica tion-in-clr- Integat Ion


N'appelle pas ConfigurationManager.refreshsection ("Connexionstrings") Chaque fois qu'une petite performance touche depuis la section est reluée à partir du disque? Cette approche semble inutile car le fichier de configuration change rarement. Je préférerais exécuter DBCC FreesystemCache lorsque des modifications sont déployées (normalement pendant les heures de pointe).


@Jeeb assez juste. J'ai fait des tests et la performance était certainement pire sur des rangées de 10k appelant l'actualisation à chaque fois. J'ai mis à jour pour clarifier les lecteurs comment aborder cela. Néanmoins, DBCC freeystemcache est généralement une mauvaise idée.



1
votes

essayez-vous d'accéder au même serveur SQL que le CLR fonctionne? Si tel est le cas, vous pouvez utiliser un type spécial de chaîne de connexion appelée "connexion contextuelle".

https://msdn.microsoft.com/en-us/library/ms131053.cox xxx

essentiellement, vous dites au code qu'il doit utiliser Le serveur SQL sous-jacent (dans ce contexte) et vous n'avez même pas besoin de spécifier les informations de connexion. Si vous essayez de courir un code réutilisable arbitraire en tant que CLR, vous vous engagez probablement une sorte de crime logiciel et ne devrait tout simplement pas le faire.


1 commentaires

Droite! Quelle ironie que tous les exemples observés sont concernés par les chaînes de connexion ....



0
votes

Voici comment je l'ai fait. Cela fonctionne parfaitement pour moi et je peux installer mon assemblée sur n'importe quelle instance maintenant et cela fonctionnera parfaitement.

   SqlConnectionStringBuilder sqlb = new SqlConnectionStringBuilder("");
        sqlb.ContextConnection = true;
        string newConnStr = sqlb.ToString();

        using (SqlConnection c = new SqlConnection(newConnStr))

        {
            c.Open();

            //This is the database name
            DatabaseName = c.Database;

            //We need to use some simple SQL to get the server and instance name.
            //Returned in the format of SERVERNAME\INSTANCENAME
            SqlCommand cmd = new SqlCommand("SELECT @@SERVERNAME [Server]", c);
            SqlDataReader rdr = cmd.ExecuteReader();
            if (rdr.Read())
            {
                ServerName = rdr["Server"].ToString();
            }
        }


0 commentaires