Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SQLCMD连接到(localdb)时如何使用相对路径?_C#_Sqlcmd_Localdb_Sql Server 2014 Localdb - Fatal编程技术网

C# 使用SQLCMD连接到(localdb)时如何使用相对路径?

C# 使用SQLCMD连接到(localdb)时如何使用相对路径?,c#,sqlcmd,localdb,sql-server-2014-localdb,C#,Sqlcmd,Localdb,Sql Server 2014 Localdb,好的,我们将其用作数据库,以支持应用程序上的回归测试。我们有一个非常复杂的模式和发布配置文件,所以我们在C#代码中使用“在附加时创建db”,然后使用SQLCMD运行脚本,将db升级到当前版本,插入一些测试数据,运行测试,删除所有内容等。通常情况下,这可以正常工作 我最近注意到,如果MDF文件的路径嵌套太深,那么SQLCMD将失败,并出现“SQLCMD:'-d':参数太长(最大值为128个字符)”错误,这是正确的,因为 “别担心,”我对自己说,“我会让它成为一条相对的道路,一切都会很棒的!”。亲爱

好的,我们将其用作数据库,以支持应用程序上的回归测试。我们有一个非常复杂的模式和发布配置文件,所以我们在C#代码中使用“在附加时创建db”,然后使用SQLCMD运行脚本,将db升级到当前版本,插入一些测试数据,运行测试,删除所有内容等。通常情况下,这可以正常工作

我最近注意到,如果MDF文件的路径嵌套太深,那么SQLCMD将失败,并出现“SQLCMD:'-d':参数太长(最大值为128个字符)”错误,这是正确的,因为

“别担心,”我对自己说,“我会让它成为一条相对的道路,一切都会很棒的!”。亲爱的读者,我错了!将dbname更改为相对于sqlcmd工作目录的路径只会导致sqlcmd的登录错误:

Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Login failed for user 'DOMAIN\myUser'..
Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Cannot open database "Source\Solution.Name\Solution.Name.Tests.Regression\bin\DEVT\TestDb.mdf" requested by the login. The login failed..
sqlcmd使用的命令like等效于以下命令:

"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE" -S (localdb)\v11.0 -i "path\to\baseline.sql" -E -e -b -r1 -d "Source\Solution.Name\Solution.Name.Tests.Regression\bin\DEVT\TestDb.mdf"
其中sqlcmd工作目录是源目录的父目录。Sqlcmd是从我们的C代码运行的,如下所示:

        var process = new Process
        {
            StartInfo = { FileName = "C:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn\\SQLCMD.EXE" }
        };

        process.StartInfo.Arguments = " -S (localdb)\v11.0 -i \"path\\to\\baseline.sql\" -E -e -b -r1 -d \"Source\\Solution.Name\\Solution.Name.Tests.Regression\\bin\\DEVT\\TestDb.mdf\"";
        process.StartInfo.WorkingDirectory = "C:\users\myUser\projects\projectName\";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.RedirectStandardError = true;

        try
        {
            process.Start();
            string error = process.StandardError.ReadToEnd();
            process.WaitForExit();
        }
        catch(Exception e)
        {
            //error handling, print error string etc
        }
localDB已在我们的回归测试中附加,因此:

            SqlConnection conn = new SqlConnection("Data Source=(LocalDB)\\v11.0;AttachDbFilename=|DataDirectory|\\TestDb.mdf;Integrated Security=True;MultipleActiveResultSets=True;Connect Timeout=30");
            conn.Open();
因此,我可以轻松地在C#连接字符串中使用相对路径,并使用“AttachDbFilename=| DataDirectory | \TestDb.mdf;”。我还可以通过将项目重新定位到C:\驱动器的根目录并缩短路径来解决这个问题,但这似乎是一个很难解决的问题

有没有办法在sqlcmd的参数中使用相对路径,这样就不必使用绝对路径?我在网上找到的每一个将sqlcmd与localdb结合使用的例子都使用绝对路径,唯一的相对路径是我们已经使用过的C#apps的连接字符串。提前谢谢