【问题标题】:Creating a stored procedures from code - C#从代码创建存储过程 - C#
【发布时间】:2016-03-11 22:34:21
【问题描述】:

我在 SQL Server 数据库中创建存储过程时遇到问题。这就是我会做的:

public void selectMeetings(String PID)
{
    String connection = "Server=localhost;Database=master;Integrated security=true;";
    SqlConnection Connection = new SqlConnection();

    Connection = new SqlConnection(connection);
    Connection.Open();

    string script = "USE ["+PID+ "] GO CREATE PROCEDURE selectMeetings AS SELECT * FROM dbo.MEETING GO";

    SqlCommand command = new SqlCommand(script, Connection);

    try
    {
       command.ExecuteNonQuery();
    }
    catch (System.Exception ex)
    {
        throw ex;
    }
}

问题是这样的:

“GO”附近的语法不正确。
'CREATE/ALTER PROCEDURE' 必须是查询批处理中的第一条语句

我试图删除 GO,但问题是:

'CREATE/ALTER PROCEDURE' 必须是查询中的第一条语句 批处理。

如何解决这个问题?谢谢

【问题讨论】:

  • GO 是批处理分隔符,而不是 T-SQL。将连接字符串设置为默认目录并删除USE。更多here
  • 完全正确,那么我该如何解决以进行交易?
  • 您需要将其与您正在编码的内容分开......在 SSMS 中尝试并首先将其放在那里,然后将其带回并相应地放入您的代码中。
  • CREATE PROCEDURE selectMeetings AS BEGIN SELECT * FROM dbo.MEETING END 并将;Initial Catalog=<your_DB> 添加到连接字符串
  • 您看到的代码取自 SQL Server 2014 创建存储过程面板时

标签: c# sql-server stored-procedures


【解决方案1】:

client code 切换数据库,正如其他人所说,不要发送GO,因为它不是 T-SQL 命令:

public void selectMeetings(String PID)
{
    String connection = "Server=localhost;Database=master;Integrated security=true;";
    SqlConnection Connection = new SqlConnection();

    Connection = new SqlConnection(connection);
    Connection.Open();

    Connection.ChangeDatabase(PID);

    string script = "CREATE PROCEDURE selectMeetings AS SELECT * FROM dbo.MEETING";
    SqlCommand command = new SqlCommand(script, Connection);

    //You're not fishing. There's no point in catch and release
    command.ExecuteNonQuery();
}

最佳实践的进一步修复:

public void selectMeetings(String PID)
{
    String connection = "Server=localhost;Database=master;Integrated security=true;";
    using(SqlConnection Connection = new SqlConnection(connection))
    {
      Connection.Open();

      Connection.ChangeDatabase(PID);

      string script = "CREATE PROCEDURE selectMeetings AS SELECT * FROM dbo.MEETING";
      using(SqlCommand command = new SqlCommand(script, Connection))
      {
        command.ExecuteNonQuery();
      }
    }
}

【讨论】:

  • 执行后不应该关闭连接吗?
  • 我关闭了连接,它可以工作!谢谢你。现在我说的答案是对的。
  • @Mr.Developer - 理想情况下,您将所有使用的 SqlConnectionSqlCommand 对象包装在 using 语句中,以便自动清理它们。我主要是想解决眼前的问题。
猜你喜欢
  • 2017-02-27
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多