2

わかりました。MS LocalDBをデータベースとして使用して、アプリの回帰テストを強化しています。非常に複雑なスキーマとリリース プロファイルがあるため、C# コードで「接続時にデータベースを作成」を使用し、次に SQLCMD を使用してスクリプトを実行してデータベースを現在のバージョンにし、テスト データを挿入し、テストを実行し、すべてを破棄します。通常はこれで問題なく動作します。

MDF ファイルのパスのネストが深すぎると、SQLCMD が「Sqlcmd: '-d': Argument too long (maximum is 128 characters)」というエラーで失敗することに最近気付きました。 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();

したがって、"AttachDbFilename=|DataDirectory|\TestDb.mdf;" を使用して、C# 接続文字列で相対パスを簡単に使用できます。プロジェクトを C:\ ドライブのルートに移動し、パスを短くすることでこの問題を回避することもできますが、これはハッキーな回避策のようです。

絶対パスを使用する必要がないように、sqlcmd への引数で相対パスを使用する方法はありますか? localdb で sqlcmd を使用するオンラインで見つけたすべての例では、絶対パスを使用しています。唯一の相対パスは、既に使用している C# アプリの接続文字列にあります。前もって感謝します。

4

0 に答える 0