11
votes

Comment exécuter SQL avec des commentaires et faire des instructions en utilisant SQLConnection?

Je n'arrive pas à exécuter SQL qui crée une base de données à l'aide d'un objet DBCommand. Qu'est-ce que je fais mal? Voici mon code: xxx

Voici l'erreur:

La syntaxe de la requête n'est pas valide., Près de Terme '/', ligne 1, colonne 2. Description: Une exception non gérée eu lieu pendant l'exécution de la Demande Web actuelle. S'il vous plaît examiner le Trace de pile pour plus d'informations sur l'erreur et l'endroit où il est originaire le code.

Détails d'exception: System.data.entitysqxception: la La syntaxe de requête n'est pas valide., Près du terme '/', ligne 1, colonne 2.

Voici la première partie du fichier. L'exception est lancée en ce qui concerne les commentaires sur la première ligne: xxx

Ce même script SQL exécute simplement de SQL Management Studio Express (en fait que l'application a généré ce script!) . C'est juste la vue de la requête de l'explorateur de serveur de Studio de Visual Studio et de mon propre code qui semble échouer.


2 commentaires

Remarque: go n'est pas une commande SQL, il s'agit d'une commande à l'outil client (tel que OSQL, analyseur de requête ou dans ce cas SMSS.) Pour briser le script dans des "lots" séparés. Chaque lot est un appel séparé sur le serveur.


Dupliqué possible de Exécutez un grand script SQL (avec des commandes Go)


4 Réponses :


8
votes

Voici un extrait de code que je Publié sur mon blog Il y a quelque temps, cela peut résoudre ce problème: xxx

Il divise le script SQL dans des commandes distinctes et exécute chacun d'eux. J'utilise régulièrement cela pour configurer des bases de données de test avec des scripts SQL générés.


5 commentaires

+1, mais je ne pense pas que ce soit le problème problème ici. L'erreur se plaint du commentaire au début du fichier.


@Joel: Je pense que c'est mai être qu'il se plaint en fait de la déclaration complète, qui arrive à commencer par le commentaire. On ne peut pas être sûr cependant, alors j'ai édité le texte pour être moins sûr de savoir s'il fournit une solution ou non.


Le séparateur de lots Go est valable entouré d'espace blanc, au moins dans SMSS pour SQL Server 2005.


@Mork: Command.Dispose () n'a plus besoin car il est à l'intérieur à l'aide de


Fonctionne comme un charme même avec des trucs complexes



11
votes

Vous devez utiliser les classes de gestion SQL au lieu du SQLCOMMAND normal. Cette page vous indique Comment le faire. Si vous essayez d'analyser vous-même le SQL vous-même, il y aura toujours des cas de bord que vous manquez. Par exemple, si une chaîne dans le code contient le mot "go" avec des retours de chariot de direction et de fuite?

ajoutez ces références: p>

  • Microsoft.SQLSERVER.SMO LI>
  • Microsoft.SQLSERVER.ConnectionInfo LI>
  • microsoft.sqlserver.management.sdk.sfc em> (modifier: cette référence n'est pas nécessaire) li> ul>

    Ensuite, vous pouvez utiliser ce code: P>

    string connectionString, scriptText;
    SqlConnection sqlConnection = new SqlConnection(connectionString);
    ServerConnection svrConnection = new ServerConnection(sqlConnection);
    Server server = new Server(svrConnection);
    server.ConnectionContext.ExecuteNonQuery(scriptText);
    


1 commentaires

Impressionnant. Je n'ai pas pu trouver le Microsoft.SQLServer.management.sdk.sfc Assemblage de référence, mais il s'est avéré qu'il n'était pas nécessaire de toute façon.



1
votes

Je trouve qu'il est étrange que vous obtenez une intitenceqlexception ...

Une autre solution que vous pouvez choisir, est d'exécuter ce script via l'outil OSQL Command-Line. Vous pouvez créer une instance System.Diagnostics.Process, et utilisez ce processus pour appeler OSQL qui exécute le script. P>

System.Diagnostics.Process p = new System.Diagnostics.Process ();

p.StartInfo.FileName = Environment.GetEnvironmentVariable ("COMSPEC");
p.StartInfo.UseShellExecute = false;
p.StartInfo.ErrorDialog = false;

p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;

p.Start ();

p.StandardInput.WriteLine ("echo off");
string command = @"osql -U -b -e -S " + servername + " -d " + databasename + " -i \'" + filename + "\'";
p.StandardInput.WriteLine (command);
p.StandardInput.WriteLine ("exit");

p.WaitForExit ();


1 commentaires

Merci pour le conseil. Cela peut s'avérer utile dans un autre scénario de la mienne.



0
votes

dans SQL Server Vous pouvez concaténer autant de requêtes que vous le souhaitez avec un séparateur d'espace simple, mais pour cela, vous devez supprimer le "Go".
Exemple:

BEGIN TRANSACTION   SET QUOTED_IDENTIFIER ON  SET ARITHABORT ON  SET NUMERIC_ROUNDABORT OFF   SET CONCAT_NULL_YIELDS_NULL ON   SET ANSI_NULLS ON   SET ANSI_PADDING ON   SET ANSI_WARNINGS ON   COMMIT   BEGIN TRANSACTION   $remove this GO here$   CREATE TABLE dbo.Tmp_Tralala(   ERRID numeric (18,0) NOT NULL) ) ON [PRIMARY]   $remove this GO here$   IF EXISTS(SELECT * FROM dbo.Tralala)   EXEC('INSERT INTO ..etc


0 commentaires