Как использовать относительный путь при подключении к (localdb) с SQLCMD?

Итак, мы используем MS LocalDB в качестве базы данных для регрессионных тестов в нашем приложении. у нас есть довольно сложная схема и профиль выпуска, поэтому мы используем "create db on attach" в коде C#, затем используем SQLCMD для запуска наших сценариев, чтобы привести db к текущей версии, вставить некоторые тестовые данные, запустить наши тесты, разорвать все вниз и т. д. Обычно это работает нормально.

Недавно я заметил, что если вложение пути файла MDF слишком глубокое, то SQLCMD завершается с ошибкой "Sqlcmd: '-d': Аргумент слишком длинный (максимум 128 символов)", что правильно, так как параметр -d для sqlcmd - это имя базы данных, которое может быть длиной всего 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, была эквивалентна приведенной ниже:

"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#, которые мы уже используем. заранее спасибо.

0 ответов

Другие вопросы по тегам