【问题标题】:Run T-SQL commands from .net从 .net 运行 T-SQL 命令
【发布时间】:2012-07-08 08:27:22
【问题描述】:

我有一个应用程序可以向 sql server 添加新登录名,然后将其映射到所有数据库并使其成为“db_owner”(这些是要求...)。 当我构建应用程序时,我使用了 SMO,一切都很完美。 现在要求变了,我不能再使用 SMO 了 :( 所以我需要从我的应用程序中运行 T-SQL 命令...... 我的问题是,当我运行应用程序时,SQL 服务器中没有任何反应 - 未添加登录名,也未映射到所有数据库 .... 但是当我在 SQL 服务器管理工​​作室中执行这些行时,它工作得很好。 ..

这些是命令 -

create login dbUser WITH PASSWORD = 'passsword';

use DB_MyLog;
create user dbUser for login dbUser;
use DB_MyLog
EXEC sp_addrolemember 'db_owner','dbUser'

在我的应用程序中,我像这样运行它们 -

string connString = "Data Source=" + ConfigurationManager.AppSettings.Get("localhost_SQLEXPRESS")
                                    + ";Initial Catalog=" + "master" + ";User ID=" + ConfigurationManager.AppSettings.Get("user")
                                    + ";Password=" + ConfigurationManager.AppSettings.Get("password");

        SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connString);

        builder.AsynchronousProcessing = true;

        using (SqlConnection sqlConnection1 = new SqlConnection(builder.ConnectionString))
        {

            using (SqlCommand cmd = new SqlCommand("CREATE LOGIN " + ConfigurationManager.AppSettings.Get("dbUser") +
                                                    " WITH PASSWORD=N'" + ConfigurationManager.AppSettings.Get("dbUserPass") + "' "
                                                     , sqlConnection1))
            {

                sqlConnection1.Open();

                cmd.BeginExecuteNonQuery();

             }
        }

在另一种方法中我运行 -

  string connString = "Data Source=" + ConfigurationManager.AppSettings.Get("localhost_SQLEXPRESS")
                + ";Initial Catalog=" + "master" + ";User ID=" + ConfigurationManager.AppSettings.Get("user")
                + ";Password=" + ConfigurationManager.AppSettings.Get("password");

        SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connString);

        builder.AsynchronousProcessing = true;

        using (SqlConnection sqlConnection1 = new SqlConnection(builder.ConnectionString))
        {
            //get all databases
            using (SqlCommand cmd = new SqlCommand("SELECT * FROM sys.sysdatabases", sqlConnection1))
            {

                sqlConnection1.Open();
                SqlDataReader reader = cmd.ExecuteReader();

                // Call Read before accessing data.
                while (reader.Read())
                {
                    using (SqlConnection sqlConnection2 = new SqlConnection(builder.ConnectionString))
                    {
                        sqlConnection2.Open();
                        using (SqlCommand cmd1 = new SqlCommand("use " + reader[0].ToString() + ";" +
                                                                "create user " + ConfigurationManager.AppSettings.Get("dbUser") + " for login " + ConfigurationManager.AppSettings.Get("dbUser") + ";" +
                                                                "use " + reader[0].ToString() +
                                                                " EXEC sp_addrolemember 'db_owner','" + ConfigurationManager.AppSettings.Get("dbUSer") + "'"
                                                                , sqlConnection2))
                        {
                            cmd1.BeginExecuteNonQuery();

                        }

                    }
                }

                // Call Close when done reading.
                reader.Close();

            }
        }

【问题讨论】:

  • 如果您使用BeginExecuteNonQuery 并发生错误,它只会在回调处理程序中可见。也许打电话给ExecuteNonQuery而不是BeginExecuteNonQuery
  • @Andomar 当我将 BeginExecuteNonQuery 更改为 ExecuteNonQuery 时,我能够捕捉到我的异常并修复我的错误......现在它工作正常,谢谢......如果你将此建议添加到答案中我会接受的……

标签: .net sql sql-server-2008 tsql c#-2.0


【解决方案1】:

如果您使用BeginExecuteNonQuery 并发生错误,它只会在回调处理程序中可见。也许打电话给ExecuteNonQuery而不是BeginExecuteNonQuery

【讨论】:

    【解决方案2】:

    如果您为 sqlConnection2 设置 ";Initial Catalog=" + reader[0].ToString() ,而不是重新使用 SqlConnectionStringBuilder 构建器,它是否有效?然后,您可以省略 USE 语句,发出两个单独的 SqlCommand(CREATE USER、EXEC)。

    将这些步骤分开可能会帮助您确定哪个语句失败以及在哪个数据库上使用 while() 循环中的 try/catch。

    【讨论】:

      猜你喜欢
      • 2013-12-27
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多