2013-08-08 1 views
1

J'ai écrit du C# pour exécuter des scripts SQL spécifiés, séparer les commandes du séparateur de lots GO et exécuter chaque commande. C'est ainsi que les objets SQL peuvent être installés au début de l'application. Cependant, j'ai un problème avec l'installation des assemblages et des fonctions CLR.Installation d'objets SQL en C# - problème lors de l'installation de scripts d'assemblage et de fonctions CLR

Il se déroulera à travers et créer l'assemblage CLR OK, mais quand il a ensuite essayé de créer la fonction, il retourne l'erreur:

Incorrect syntax near the keyword 'FUNCTION'. Incorrect syntax near the keyword 'AS'.

J'ai essayé de créer l'assemblage et la fonction en utilisant le script directement SSMS et ça fonctionne bien. J'ai également exécuté le script de fonction dans mon C# après avoir créé l'assembly dans SSMS et ceci fonctionne bien. Cela ne semble pas créer la fonction si les deux scripts sont exécutés en C#.

C# Code pour exécuter le script SQL:

var fileInfo = new FileInfo(sqlDirectory + "\\" + fileName); 
var script = fileInfo.OpenText().ReadToEnd(); 

if (!String.IsNullOrEmpty(script)) 
{ 
    string sqlBatch = string.Empty; 

    script += "\nGO"; 

    try 
    { 
     foreach (
      string line in 
       script.Split(new string[2] {"\n", "\r"}, 
        StringSplitOptions.RemoveEmptyEntries)) 
     { 
      if (line.ToUpperInvariant().Trim() == "GO") 
      { 
       if (sqlBatch != "") 
       { 
        cmd.CommandType = CommandType.Text; 

        cmd.CommandText = sqlBatch; 

        cmd.ExecuteNonQuery(); 
        sqlBatch = string.Empty; 
       } 
      } 
      else 
      { 
       sqlBatch += line + "\n"; 
      } 
     } 

     fileInfo.OpenText().Close(); 
    } 
    catch (Exception err) 
    { 
     var context = HttpContext.Current; 
     Global.InstallError = "File Name: " + fileName + "<br/>" + 
           "Error: " + err.Message; 
    } 
} 

CLR Fonction:

/****** Object: UserDefinedFunction [dbo].[fn_JSON_FormatArray] Script Date:  03/07/2013 11:52:18 ******/ 
SET ANSI_NULLS OFF 
GO 

SET QUOTED_IDENTIFIER OFF 
GO 

CREATE FUNCTION [dbo].[fn_JSON_FormatArray](@value [xml], @label [nvarchar](4000)) 
RETURNS [xml] WITH EXECUTE AS CALLER 
AS 
EXTERNAL NAME [CLRExtensions].[UserDefinedFunctions].[fn_JSON_FormatArray] 
GO 

EXEC sys.sp_addextendedproperty @name=N'SqlAssemblyFile', @value=N'JSON\fn_JSON_FormatArray.cs' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'FUNCTION',@level1name=N'fn_JSON_FormatArray' 
GO 

EXEC sys.sp_addextendedproperty @name=N'SqlAssemblyFileLine', @value=N'11' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'FUNCTION',@level1name=N'fn_JSON_FormatArray' 
GO 

Répondre

0

J'ai maintenant résolu ce problème. Le problème s'est avéré être que j'utilisais plus tard la même SQLCommand pour exécuter une procédure stockée (comme j'ai donné une commande SQLTransaction pour que je puisse revenir en arrière en cas d'échec) et ai oublié de supprimer les paramètres ajoutés quand je cours la commande de texte suivante. Par conséquent, il exécutait le premier fichier de script et échouait par la suite.

Questions connexes