我也一直在尝试定制实例的位置,并找到了一个解决方案。正如在之前的文章中提到的,它似乎默认使用%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances。经过一些试验之后,SQLLocabDB命令行实用程序似乎使用%USERPROFILE%环境变量(而不是%LOCALAPPDATA%)来查找此位置。
以下方法适用于我(从命令提示符使用SQLLocalDB ):
代码语言:javascript复制C:\Users\dan.smith>echo %USERPROFILE%
C:\Users\dan.smith
C:\Users\dan.smith>set USERPROFILE=c:\temp
C:\Users\dan.smith>echo %USERPROFILE%
c:\temp
C:\Users\dan.smith>mkdir c:\temp\AppData\Local
C:\Users\dan.smith>sqllocaldb create test
LocalDB instance "test" created with version 13.0.1100.286.
C:\Users\dan.smith>cd C:\temp\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\test
C:\temp\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\test>dir /w
Volume in drive C has no label.
Volume Serial Number is 4A71-7A6F
Directory of C:\temp\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\test
[.] [..]
error.log error1.log
log.trc master.mdf
mastlog.ldf model.mdf
modellog.ldf msdbdata.mdf
msdblog.ldf system_health_0_131061520581180000.xel
tempdb.mdf templog.ldf
12 File(s) 46,701,550 bytes
2 Dir(s) 117,107,499,008 bytes free如图所示,这在c:\temp下创建了我的LocalDB实例,尽管继承了从"AppData“开始的原始文件夹层次结构(这似乎是不可更改的)。请注意,手动创建文件夹层次结构的"AppData\Local“部分也是必要的,否则将失败。
下一个问题实际上是从C#应用程序连接到此数据库。为此,必须将%USERPROFILE%环境变量设置为与上述位置相同的位置,即:
代码语言:javascript复制Environment.SetEnvironmentVariable("USERPROFILE", "c:\\temp");这应该在建立数据库连接之前完成。最好是在应用程序的入口点的某个位置执行此操作。
总而言之,这是一种黑客行为,但它至少让人可以选择将数据存储在"c:\users...“之外的其他位置。
更新
值得注意的是,这里的想法是只为当前运行的进程更改%USERPROFILE%环境变量,而不是在整个计算机范围内。这是在命令提示符下使用set时的行为。上面提到的Environment.SetEnvironmentVariable方法重载也默认使用此行为,不过可能更好的方法是使用更明确的内容,例如:
代码语言:javascript复制Environment.SetEnvironmentVariable("USERPROFILE", "c:\\temp", EnvironmentVariableTarget.Process);