わかりました。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# アプリの接続文字列にあります。前もって感謝します。