gpt4 book ai didi

c# - 以编程方式运行 CREATE PROCEDURE 脚本

转载 作者:行者123 更新时间:2023-12-02 17:45:57 27 4
gpt4 key购买 nike

我正在尝试开发一个将运行 CREATE PROCEDURE 脚本的小应用程序。一个简单的例子:

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'ap_get_roles_in_system')
BEGIN
DROP Procedure [dbo].[ap_get_roles_in_system]
END

GO

CREATE PROCEDURE [dbo].[ap_get_roles_in_system]
(
@system_id int
)
AS
SELECT * FROM roles

GO

GRANT EXEC ON [dbo].[ap_get_roles_in_system] TO PUBLIC

GO

如果我将此文本加载到一个字符串中,并通过 ExecuteNonQuery() 运行它,则删除存储过程的第一项工作正常,但它没有运行 Create,而是发现参数存在语法错误存储过程的定义,即:尚未声明。

简而言之,它不是尝试运行 CREATE,而是以某种方式尝试将脚本作为脚本运行,而不是 CREATE。不确定正确的措辞是什么。

如果将上面的脚本粘贴到 Sql Management Studio 中,效果会很好。

这是我正在执行的代码:

public string RunSql(string Sql)
{
string result = string.Empty;

_conn.Open();
SqlCommand cmd = new SqlCommand(Sql, _conn);
cmd.CommandType = CommandType.Text;

try
{
cmd.ExecuteNonQuery();

result = "Succeeded";
}
catch (SqlException ex)
{
result = ex.Message;
}

return result;
}

最佳答案

@RichardSchneider 的回答让我找到了我找到的解决方案,但我认为在这么晚的时候,因为有这么多观点,我应该发布解决问题的代码,Richard 的回答让我找到了这个问题。这是一个名为 SqlAction 的完整类。注意,我用“GO”分割了整个文本,然后将组件放入一个数组中,依次执行每个组件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace SProcRunner
{
public class SqlAction
{
public SqlAction(string connString)
{
SqlConnectionStringBuilder sb = new SqlConnectionStringBuilder(connString);

_conn = new SqlConnection(sb.ToString());
}

private SqlConnection _conn;

public string RunSql(string Sql)
{
string result = string.Empty;

// split the sql by "GO"

string[] commandText = Sql.Split(new string[] { String.Format("{0}GO{0}", Environment.NewLine) }, StringSplitOptions.RemoveEmptyEntries);

_conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = _conn;
cmd.CommandType = CommandType.Text;

for (int x = 0; x < commandText.Length; x++)
{
if (commandText[x].Trim().Length > 0)
{
cmd.CommandText = commandText[x];
try
{
cmd.ExecuteNonQuery();
result = "Command(s) completed successfully.";
}
catch (SqlException ex)
{
result = String.Format("Failed: {0}", ex.Message);
break;
}
}
}

if (_conn.State != ConnectionState.Closed) _conn.Close();

return result;
}
}
}

关于c# - 以编程方式运行 CREATE PROCEDURE 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14758018/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com