通过C#创建存储过程

我正在尝试在我的网络应用程序中创建一个种子数据库,我能够创建数据库,填充表格,我只是坚持让存储过程工作。 这是我到目前为止,但我得到CREATE / ALTER PROCEDURE’必须是查询批次中的第一个语句。\ r \ n’GO’附近的语法不正确。 我也尝试删除GO,并在USE语句和创建过程之间添加\ r \ n,但没有运气。 任何帮助,将不胜感激。

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(); } } 

“GO”是批处理分隔符。 这不是T-SQL声明。 删除“USE”和“GO”两行,然后重试。

正如其他人所提到的,“GO”命令只是一个由SSMS解释的批处理分隔符。 您要做的是创建存储过程,如下所示:

 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(); } } 

您可以非常轻松地为打开的SqlConnection设置或更改当前数据库,而不是使用’USE [DataBase] Go’:

 connection.ChangeDatabase("YourDB"); 

一个例子:

 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); } } 

如果您正在考虑创建数据库并在代码中维护版本,您可能需要考虑使用类似迁移器框架而不是手写所有SQL。