2015-07-28 2 views
1

Cross affichée sur MSDNdéployer l'application de base de données SQL Server Express LocalDB avec « clr activé »

Mon application utilise les fonctions personnalisées group_concat sur codeplex

Je reçois l'erreur suivante lors du démarrage de l'application sur la machine cible .

Execution of user code in the .NET framework is disabled. Enable clr enabled configuration option.

En supposant localdb est installé sur la machine cible, que puis-je faire pour activer clr ainsi installer? Sur ma machine, j'ai juste ouvert SSMS et exécuté le script là.

sp_configure 'clr enabled', 1; GO RECONFIGURE; GO

Cependant, SSMS ne sera pas installé sur la plupart des clients et je ne suis pas sûr de savoir comment faire de sorte que la base de données peut utiliser ces fonctions. Aucune suggestion?

EDIT: J'ai tenté de définir ceci dans C# à partir de l'application de deux manières différentes, mais les deux ont échoué.

public void EnableCLR(string ConnectionString) 
    { 
     using(SqlConnection con = new SqlConnection(ConnectionString)) 
     { 
      using(SqlCommand cmd = new SqlCommand("sp_configure 'clr enabled', 1", con)) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 

       con.Open(); 

       cmd.ExecuteNonQuery(); //Error: Unable to find stored procedure "sp_configure 'clr enabled', 1" 
      } 
     } 
    } 

Alors j'ai essayé ce

public void EnableCLR(string ConnectionString) 
    { 
     using(SqlConnection con = new SqlConnection(ConnectionString)) 
     { 
      using(SqlCommand cmd = new SqlCommand("sp_configure", con)) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 

       con.Open(); 

       SqlParameter clrParam = new SqlParameter(); 

       clrParam.ParameterName = "clr enabled"; 

       clrParam.Value = 1; 

       cmd.Parameters.Add(clrParam); 

       cmd.ExecuteNonQuery(); //Error: @clr enabled is not a parameter for procedure sp_configure. 
      } 
     } 
    } 
+2

Le problème est que vous configurez '' CommandType' à StoredProcedure'. Tu n'as pas besoin de ça. Le type par défaut de 'Text' est bien dans ce but. Si vous utilisez le type 'StoredProcedure', vous pouvez uniquement spécifier le nom de la proc comme' CommandText', ce que vous avez fait correctement, mais vous devez ensuite définir le (s) nom (s) du paramètre correctement. Ici, vous avez utilisé la valeur du paramètre comme nom. Les noms de paramètres pour 'sp_configure' sont' configname' et 'configvalue' (n'ont pas besoin de' @ 'sur les noms de paramètres quand ils font le type' StoredProcedure'). Voir le document 'sp_configure': https://msdn.microsoft.com/en-us/library/ms188787.aspx –

Répondre

2

Comment installez-vous LocalDB? Je suppose que vous attachez le fichier MDF via la chaîne de connexion, donc incapable d'exécuter ces instructions dans un script SQL. En supposant qu'il n'y ait pas non plus SQLCMD.EXE pour lancer une requête, vous devriez pouvoir créer une application de console distincte que le programme d'installation peut exécuter après l'installation de LocalDB. Cette application console peut exécuter des instructions SQL via SqlCommand.ExecuteNonQuery(). Ces instructions SQL peuvent être codées en dur (plus difficiles à modifier) ​​ou peuvent obtenir la configuration SQL à partir du fichier app.exe.Config.

Quelque chose le long des lignes de:

SqlConnection _Connection = new SqlConnection(@"(localdb)\InstanceName"); 
SqlCommand _Command = null; 

try 
{ 
    _Command = _Connection.CreateCommand(); 
    _Connection.Open(); 

    _Command.CommandText = "EXEC sp_configure 'clr enabled', 1;"; 
    _Command.ExecuteNonQuery(); 

    _Command.CommandText = "RECONFIGURE;"; 
    _Command.ExecuteNonQuery(); 
} 
finally 
{ 
    if (_Command != null) 
    { 
    _Command.Dispose(); 
    } 
    _Connection.Dispose(); 
} 
+0

Oui, je suis en train de joindre via la chaîne de connexion avec' AttachDBFilename'. J'ai commencé à tester le SqlCommand.ExecuteNonQuery() pour cela, mais ne peux pas comprendre comment définir les paramètres pour sp_configure. Pouvez-vous fournir un exemple qui définit l'option 'clr enabled' à 1? J'ai essayé de faire ceci de quelques manières (mettra à jour ma question avec des tentatives échouées) mais n'ai eu aucun succès. – wesmantooth

+0

@wesmantooth Je viens de mettre à jour avec un exemple de code. –

+1

Fonctionne comme un charme:) Merci pour les conseils. Maintenant, je peux enfin déployer! – wesmantooth