【问题标题】:Unable to execute script from c# using smo无法使用 smo 从 c# 执行脚本
【发布时间】:2013-08-07 11:00:09
【问题描述】:

我开发了一个 C# Windows 应用程序,我需要在客户端计算机上创建一个数据库,为此我创建了一个脚本文件并在客户端计算机上安装了 SQL Server 2008 R2。

但是当我从我的代码中执行脚本时,它总是显示一个错误:

连接数据库失败。

我添加了来自

的引用的 SMO 程序集
C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\Microsoft.SqlServer.Smo.dll 

我的代码是:

string sqlConString = @"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=mydatabase;Data Source=(local)";
FileInfo file = new FileInfo(dbPath);

string script = file.OpenText().ReadToEnd();

SqlConnection con = new SqlConnection(sqlConString);

Server server = new Server(new ServerConnection(con));
server.ConnectionContext.ExecuteNonQuery(script);

file.OpenText().Close();

【问题讨论】:

    标签: c# asp.net sql-server winforms


    【解决方案1】:

    这样的事情怎么样:

    using (SqlConnection cnn = new SqlConnection(sqlConString))
    {
        var cmds = File.ReadAllText(@"path\to\file").Split(new string[] { "GO" },
            StringSplitOptions.RemoveEmptyEntries);
    
        cnn.Open();
        foreach (var cmd in cmds)
        {
            using (SqlCommand cmd = new SqlCommand(cmd, cnn))
            {
                cmd.ExecuteNonQuery();
            }
        }
    }
    

    通过这种方法,您可以得到您想要的,脚本会被执行,但您不必使用缓慢而臃肿的 SMO 界面。此外,您正在利用 using 语句,因此您不必担心非托管资源处于打开状态。

    现在,要解决failed to connect to database...,我第一次阅读时显然错过了它,如果发生这种情况,那就意味着:

    Initial Catalog=mydatabase;Data Source=(local)
    

    可能不正确。如果是,您的服务器可能不接受Windows Authentication

    我不知道你本地机器的设置,但很可能服务器是(local)\SQLEXPRESS

    【讨论】:

    • 我试过这个,它不适合我。问题是我的脚本中有很多表创建,所以每个脚本的结尾都有 GO 语句,它在 GO 附近显示不正确的语法。
    • @Raghubar,好的,这是一个很容易解决的问题。请查看我的编辑。
    • 第一条语句将整个脚本文件分割成一个字符串数组。然后你会看到我循环遍历该字符串数组(即GO 语句之间的脚本文本)并单独执行每个字符串。
    • 这是可行的,但问题是每次只创建四五个表,不超过这个。
    • @Raghubar,请发布脚本直到它失败加上你的问题中的更多行,以便我可以看到我正在使用的实际文本.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多