J'utilise l'intégration SQL Server CLR pour créer un assemblage. P>
Commande de charge:
sans app.config p>
Le code DLL contient:
aussi l'app.config contient: p>
Mais lorsque j'exécute la procédure, le serveur SQL affiche une erreur Est-ce que SQL Server CLR Integration prend en charge les fichiers app.config? p> Créer un ensemble TCPCLR à partir de 'g: \ tcpclrtest.dll' avec permission_set = dangereux code> p>
String IP = ConfigurationManager.AppSettings ["Connexion"]. Tostring (); Code> P>
system.nullreferenceException code> p>
4 Réponses :
Vous obtiendrez évidemment un jusqu'à ce que vous avez posté votre question, la page de classement de la part d'une recherche Google sur NullReferenceException code> car
ConfigurationManager.appsettings ["Connexion"] code> renvoie NULL, puis vous appelez Tostring () sur un null. < / p>
CLR Integration app.config code> était-ce
Utilisation d'une configuration d'application (app.config / web.config) fichier dans l'intégration CLR Server SQL Server . P>
Vous pouvez utiliser system.configuration code> tout ce que vous voulez; Obtenez explicitement une via
ConfigurationManager.opénexeconfiguration () Code>. Les méthodes statiques
ConfigurationManager CODE> ne fonctionnent évidemment pas, mais la partie Bold b> 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 code> obscurcit toutes les informations de localisation de par exemple.
assemblage.getexecutingassemblage () code>. 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.
Vous devez placer un fichier 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 dans votre code , vous avez besoin de cette ligne en haut: p> , puis cela fonctionnera: p> contenu de la 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;
Oui, je veux juste faire des connexions TCP à d'autres machines. Le nom du fichier de configuration doit être SQLSERVR.EXE.CONFIG B>?
@ZHENGKANG OUI, c'est le nom du fichier car il correspondra à l'exécutable sqlservr.exe code> dans ce même dossier. Je crois que vous peut i> avoir une section
appsettings code>, 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 code> Connections code> à 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 code> à
external_access code>, mais le code DLL a un
statique code> var à sotre une valeur obtenir de dB,
external_access < / code> ne peut pas être autorisé, donc je choisis
dangereux code>
@ZHENGKANG content que cela a travaillé. Concernant dangereux code>, découvrez ce que j'ai recommandé ici: Stackoverflow.com/questions/28179038/... a > 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 code> est généralement une mauvaise idée.
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 p> 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. P> P>
Droite! Quelle ironie que tous les exemples observés sont concernés par les chaînes de connexion ....
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(); } }