0

我是在 C# 中使用 sqlcmd 运行 SQL 脚本的新手。我在 Internet 上看到了一些代码,但我不明白它是如何工作的。

string path = string.Empty;
            OpenFileDialog opd = new OpenFileDialog();
            opd.Filter = "sql files|*.sql";
            if (opd.ShowDialog() == DialogResult.OK)
            {
                path = opd.FileName;//Here i am taking Database sqlScript
            }
        string tmpFile = Path.GetTempFileName();
            SqlConnectionStringBuilder connection=new SqlConnectionStringBuilder(@"Data Source=LPTP2\LPTP2;Initial Catalog=Database;Integrated Security=True");
        string argument = string.Format(@" -S {0} -d {1} -i ""{2}"" -o ""{3}""",
            @".\SQLEXPRESS", "Database", path, tmpFile);

        // append user/password if not use integrated security
        if (!connection.IntegratedSecurity)
            argument += string.Format(" -U {0} -P {1}", "sa", "abc@123");

        var process = Process.Start("sqlcmd.exe", argument);
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.CreateNoWindow = true;
        process.Start();
        while (true)
        {
            // wait for the process exits. The WaitForExit() method doesn't work
            if (process.HasExited)
                break;
            Thread.Sleep(500);
        }

我不明白这三行是如何工作的

 string tmpFile = Path.GetTempFileName();
            SqlConnectionStringBuilder connection=new SqlConnectionStringBuilder(@"Data Source=LPTP2\LPTP2;Initial Catalog=HemoTrace;Integrated Security=True");
        string argument = string.Format(@" -S {0} -d {1} -i ""{2}"" -o ""{3}""",
            @".\SQLEXPRESS", "HemoTrace", path, tmpFile);

        // append user/password if not use integrated security
        if (!connection.IntegratedSecurity)
            argument += string.Format(" -U {0} -P {1}", "sa", "abc@123");

为什么我这样做意味着我想运行一个 SQL SCRIPT 脚本来创建一个数据库。但我想使用 sqlcmd。在客户端位置,如果我执行我的 .exe 文件,它会完成我的工作(将数据库附加到服务器)。

请帮助我解决这个问题。

4

1 回答 1

0
string tmpFile = Path.GetTempFileName();

声明一个名为 tmpFile 的字符串变量并用于Path.GetTempFileName()生成唯一的临时文件名并将其存储在变量中

SqlConnectionStringBuilder connection=new 
SqlConnectionStringBuilder(@"Data Source=LPTP2\LPTP2;Initial Catalog=HemoTrace;
Integrated Security=True");

使用SqlConnectionStringBuilder该类构建 SQL Server 连接字符串。这实际上并没有连接到任何东西,它只是生成一个连接字符串。

string argument = string.Format(@" -S {0} -d {1} -i ""{2}"" -o ""{3}""",
@".\SQLEXPRESS", "HemoTrace", path, tmpFile);

声明一个名为的字符串argument并将其设置为一堆字符,包括之前生成的临时文件的路径。这串字符适合用作 SQLCMD 命令行的参数。

// append user/password if not use integrated security
if (!connection.IntegratedSecurity)
argument += string.Format(" -U {0} -P {1}", "sa", "abc@123");

使用SqlConnectionStringBuilder类的属性来确定我们是否应该添加命令行开关来指示受信任的安全性。

在所有这些之后,您运行:

var process = Process.Start("sqlcmd.exe", argument);

如果你转储这个填充字符串,你会发现可以在命令行上运行的东西。

SQLCMD 是一个命令行程序,顺便说一下,它需要安装在您的客户端机器上。

命令行程序采用您在前几行代码中构建的一堆参数。

这段代码有一些问题:

  • 您需要安装 SQLCMD.EXE 才能正常工作。
  • 您在字符串中对受信任的安全性进行硬编码,将其加载到一个特殊的类中,然后使用该类来确定您是否使用受信任的安全性……您已经对其进行了硬编码!
  • 您还可以在连接字符串中硬编码某个服务器,然后在 SQLCMD 的参数中硬编码另一个服务器
  • 在这种情况下,连接字符串(中间线)似乎是完全多余的。
于 2014-03-10T06:17:12.870 回答