我在Winforms应用程序中有这个代码在现有数据库中创建一个表(我按照here编写的内容创建了一个表):
private void CreateTables()
{
string connStr = @"Data Source=
(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|
\AYttFM.mdf;Integrated Security=True";
using (var connection = new
System.Data.SqlClient.SqlConnection(connStr))
{
try
{
connection.Open();
using (var command = connection.CreateCommand())
{
StringBuilder sb = new StringBuilder();
sb.Append("CREATE TABLE [dbo].[AssignmentHistory] ");
sb.Append("(");
sb.Append("[Id] INT NOT NULL PRIMARY KEY, ");
sb.Append("[WeekOfAssignment] DATE NOT NULL,");
sb.Append("[TalkType] INT NOT NULL,");
sb.Append("[StudentID_FK] INT NOT NULL, ");
sb.Append("[AssistantID_FK] INT NOT NULL, ");
sb.Append("[CounselPoint] INT NOT NULL");
sb.Append(")");
command.CommandText = sb.ToString();
command.ExecuteNonQuery();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
它没有投诉地运行,但没有创建表。在Visual Studio社区2015中的服务器资源管理器中刷新数据连接及其表文件夹显示没有表格。
我在上面的代码中遗漏了什么?
注意:为了格式化,我在上面几行打破了connStr;在实际代码中,connStr全部在一行上。
我也无法通过LINQPad连接到.mdf文件,使用“Default LINQ to SQL”和SQL Server Provider并导航到我项目中的.mdf文件(C:\ AYttFMApp \ AYttFMScheduler \ AYttFMScheduler \ AYttFM.mdf)。它告诉我存在网络错误:
我知道是否使用默认服务器“。\ SQLEXPRESS”或是否将其设置为我的机器名称(这是Visual Studio的服务器资源管理器中“服务器”下面的唯一条目)。
我重启了我的笔记本电脑,但没有用。服务器资源管理器的数据连接即使在我刷新之后也没有显示任何内容,并且尝试添加一个,我的机器名称作为服务器名称(毕竟,这就是服务器资源管理器中的服务器所示)并选择.mdf文件我在LINQPad测试连接时遇到了同样的错误。
Curiouser和curiouser:现在当我运行我的应用程序时,当它到达Create Table代码时,我得到一个异常消息,表示已经创建了AssignmentHistory表。然而,如果我查看Server Explorer,虽然数据库本身又回来了,但它的Tables文件夹仍然是空的。桌子怎么样都在那里而不在那里?
我仍然想知道.mdf文件中设置的属性是否错误;正如我在下面的评论中所写,属性都是默认值:“复制到输出目录”设置为“始终复制”,“构建操作”设置为“内容”是否应更改其中任何一个?
答案 0 :(得分:2)
如果代码没有在行command.ExecuteNonQuery()
上抛出任何异常,那么查询就完成了,表应该在那里。可能是因为您正在使用LocalDb
时查看错误的数据库。如果项目已将.MDF作为文件包含并且标记为始终复制到目标目录,那么正在发生的事情是VS始终查看未更改的副本,并且在调试期间始终完成Execute语句,因为未更改的副本是始终替换运行时使用的副本。
DataDirectory
指定通常在应用程序启动时分配的位置的占位符。您可以像这样获得正在使用的实际.mdf
文件的完整路径:
var fullFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.GetData("DataDirectory").ToString(), "AYttFM.mdf");
我已将.mdf
LocalDb的名称附加到路径的末尾。
您可以添加此行代码并获取文件的路径,然后使用Visual Studio表设计器打开此实例。
或者,您可以更改连接字符串并将其硬编码到.mdf文件的特定实例,保证在项目构建时不会更改。
修改 根据您的最新修改
“对象引用未设置为对象的实例”是我得到的 在运行你提供的那条线之后。
我假设你手动设置了DataDirectory
位置,道歉。如果没有手动设置变量,那么对于Windows应用程序,默认位置是.exe路径。所以代码应该更新为以下内容:
var fullFilePath = System.IO.Path.Combine(System.Reflection.Assembly.GetExecutingAssembly().Location.ToString(), "AYttFM.mdf");
这可能会解析为.\yourProjectFolder\debug\bin\AYttFM.mdf
。
属性是所有默认值:设置“复制到输出目录” “始终复制”和“构建操作”设置为“内容”
这样肯定了我之前写的内容。每次进行构建时,它都会将.mdf复制到您的可执行文件目录,并基本上将数据库刷新到其原始状态。请注意,您可以从visual studio执行多次运行,这意味着如果所有内容都已编译且没有任何更改,则新的.exe和内容将不会重新复制到现有的内容上。这就是为什么你有时会看到一个异常而有时你不是,它只是取决于.mdf是否被覆盖。
是否应更改其中任何一项?
这应该没问题,但这取决于每次都可以从干净的石板开始。这真的取决于你,这里有你可以选择的选项:
复制到输出目录属性
此属性指定所选源的条件 文件将被复制到输出目录。如果选择,请选择不复制 永远不会将文件复制到输出目录。选择始终复制 如果始终将文件复制到输出目录。选择 如果要复制文件仅在比文件更新时复制更新 输出目录中的同名现有文件。
如果要打开.mdf文件,您只需在VS项目中双击它,它应该在Server Explorer
- >中打开。 Data Connections
。没有理由在设计器中打开输出文件( .mdf 的副本),我只会像您当前的设置一样编辑项目中的文件,这是将覆盖的主文件每次输出文件。
我没有使用LINQPad的经验,所以我不能说这个应用程序是否可以附加到LocalDb实例。这是一篇关于如何从previous SO question执行此操作的帖子。
答案 1 :(得分:0)