2011-12-28 38 views
6

Estoy tratando de crear un DB inicial en mi aplicación web, y pude crear el DB, poblar las tablas, estoy atascado en conseguir que los procedimientos almacenados funcionen. Esto es lo que tengo hasta ahora, pero estoy obteniendo CREATE/ALTER PROCEDURE 'debe ser la primera declaración en un lote de consulta. \ R \ nIncorrect Sintaxis near' GO '. Intenté eliminar también los GO, y también agregué \ r \ n entre la instrucción USE y el procedimiento de creación sin suerte. Cualquier ayuda sería apreciada.Creando un procedimiento almacenado a través de C#

StringBuilder sbSP = new StringBuilder(); 
sbSP.AppendLine("USE [" + txtDBName.Text + "]"); 
sbSP.AppendLine("GO"); 
sbSP.AppendLine("CREATE PROCEDURE [spInsertADAuthorization] @AD_Account varchar(255),@AD_SID varchar(255),@AD_EmailAddress varchar(255),@DateImported datetime,@Active bit AS BEGIN SET NOCOUNT ON; INSERT INTO AD_Authorization (AD_Account, AD_SID, AD_EmailAddress, DateImported, Active) VALUES (@AD_Account,@AD_SID,@AD_EmailAddress,@DateImported,@Active) END"); 
sbSP.AppendLine("GO"); 
using (SqlConnection connection = new SqlConnection(ConnectionString)) 
    { 

    using (SqlCommand cmd = new SqlCommand(sbSP.ToString(), connection)) 
          { 
           connection.Open(); 
           cmd.CommandType = CommandType.Text; 
           cmd.ExecuteNonQuery(); 
           connection.Close(); 
          } 
         } 
+0

has necesitado haciendo caso omiso de la USO por completo y sólo ser explícito en el nombre? '" CREATE PROCEDURE ["+ txtDBName +"] .. [spInsertADAuthorization] ... "' ?? – Dracorat

+0

¿Ha considerado usar primero el Código del Entidad Framework y que genere la base de datos? Raw ADO.NET es mucho trabajo extra. – TrueWill

Respuesta

6

"GO" es un separador de lotes. No es una declaración T-SQL. Retire las líneas "USE" y "GO" e intente de nuevo.

+0

... su cadena de conexión especificará en qué base de datos está operando; es por eso que no necesita ese 'uso' (si la base de datos en su cadena de conexión coincide con la base de datos que desea inicializar, por supuesto). –

+0

El problema es que el usuario elige el nombre de la base de datos para que la cadena de conexión aún no sepa cuál es el nombre, de ahí el USO. Ahora obtengo "{" sintaxis incorrecta cerca de la palabra clave 'PROCEDURE'. \ R \ nDebe declarar la variable escalar \ "@ AD_Account \". "} Cuando se deshaga de los GO y USE. –

+2

¿Puede usar [ 'ChangeDatabase'] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.changedatabase.aspx) método para cambiar la base de datos de la conexión antes de ejecutar el código para crear el SP. –

0

Si está buscando crear una base de datos y mantener versiones en su código, puede considerar usar algo como el Migrator Framework en lugar de escribir todo ese SQL a mano.

1

Como han mencionado otros, el comando "IR" es simplemente un separador de lotes que se interpreta mediante SSMS. Lo que se quiere hacer es crear el procedimiento almacenado de la siguiente manera:

string sql = string.Format("CREATE PROCEDURE [{0}]..[spInsertADAuthorization] @AD_Account varchar(255),@AD_SID varchar(255),@AD_EmailAddress varchar(255),@DateImported datetime,@Active bit AS BEGIN SET NOCOUNT ON; INSERT INTO AD_Authorization (AD_Account, AD_SID, AD_EmailAddress, DateImported, Active) VALUES (@AD_Account,@AD_SID,@AD_EmailAddress,@DateImported,@Active) END", txtDBName.Text); 

using (SqlConnection connection = new SqlConnection(ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand(sql, connection)) 
    { 
     connection.Open(); 
     cmd.CommandType = CommandType.Text; 
     cmd.ExecuteNonQuery(); 
     connection.Close(); 
    } 
} 
+0

Obteniendo esto cuando se ejecuta: {" 'CREATE/ALTER PROCEDURE' no permite especificar el nombre de la base de datos como un prefijo al nombre del objeto. \ R \ nDebe declarar la variable escalar \ "@ AD_Account \". " } –

+0

No veo la instrucción END en este CREATE PROCE DURE –

1

En lugar de utilizar 'Usar [Base de datos] Ir' puede establecer o cambiar la base de datos actual para un SqlConnection abierto con mucha facilidad:

connection.ChangeDatabase("YourDB"); 

Un ejemplo:

private static void ConctDatabase(string connectionString) 
{ 
    using (SqlConnection conn = new SqlConnection(connectionString)) 
    { 
     conn.Open(); 
     MessageBox.Show("Database: {0}", conn.Database); 
     conn.ChangeDatabase("Northwind"); 
     MessageBox.Show("Database: {0}", conn.Database); 
    } 
} 
Cuestiones relacionadas