Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么没有创建我的表?_C#_Sqlconnection_Linqpad_Create Table_Mdf - Fatal编程技术网

C# 为什么没有创建我的表?

C# 为什么没有创建我的表?,c#,sqlconnection,linqpad,create-table,mdf,C#,Sqlconnection,Linqpad,Create Table,Mdf,我在Winforms应用程序中获得了以下代码,用于在现有数据库中创建一个表(通过以下方式创建): 它毫无怨言地运行,但没有创建表。在Visual Studio Community 2015的服务器资源管理器中刷新数据连接及其表文件夹时,不会显示任何表 我在上面的代码中遗漏了什么吗 注意:为了格式化,我在上面的几行上断开了connStr;在实际代码中,connStr都在一行上 我也无法使用“默认LINQ to SQL”和SQL Server提供程序通过LINQPad连接到.mdf文件,并导航到项目

我在Winforms应用程序中获得了以下代码,用于在现有数据库中创建一个表(通过以下方式创建):

它毫无怨言地运行,但没有创建表。在Visual Studio Community 2015的服务器资源管理器中刷新数据连接及其表文件夹时,不会显示任何表

我在上面的代码中遗漏了什么吗

注意:为了格式化,我在上面的几行上断开了connStr;在实际代码中,connStr都在一行上

我也无法使用“默认LINQ to SQL”和SQL Server提供程序通过LINQPad连接到.mdf文件,并导航到项目中的.mdf文件(C:\AYttFMApp\AYttFMScheduler\AYttFMScheduler\AYttFM.mdf)。它告诉我有一个网络错误:

无论是使用默认服务器“.\SQLEXPRESS”还是将其设置为我的机器名(这是Visual Studio的服务器资源管理器中“服务器”下的唯一条目),我都会获得该信息

更新 我重新启动了我的笔记本电脑,但没用。服务器资源管理器的数据连接没有显示任何内容,即使在我刷新并尝试添加一个数据连接后,以我的计算机名作为服务器名(毕竟,这就是服务器资源管理器中服务器的名称),并且选择.mdf文件在测试连接时与LINQPad相同的错误

更新2 Curiouser和Curiouser:现在,当我运行我的应用程序时,当它到达创建表代码时,我得到一条异常消息,表示AssignmentHistory表已经创建。然而,如果我看一下服务器资源管理器,尽管数据库本身又回来了,但它的Tables文件夹仍然是空的。桌子怎么可能既在那里又不在那里


我仍然想知道在.mdf文件上设置的属性是否错误;正如我在下面的评论中所写的那样,这些属性都是默认值:“复制到输出目录”设置为“始终复制”,而“构建操作”设置为“内容”,是否应该更改其中的任何一个

如果代码在第
行command.ExecuteNonQuery()
上没有抛出任何异常,那么查询确实完成了,表应该在那里。这可能是因为在使用
LocalDb
时,您只是查看了错误的数据库。如果项目已将.MDF作为文件包含,并将其标记为始终复制到目标目录,则发生的情况是VS始终查看未更改的副本,并且Execute语句始终在调试期间完成,因为未更改的副本始终替换运行时使用的副本

DataDirectory
为通常在应用程序启动时分配的位置指定占位符。您可以获得实际使用的
.mdf
文件的完整路径,如下所示:

var fullFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.GetData("DataDirectory").ToString(), "AYttFM.mdf");
我已将您的
.mdf
LocalDb的名称附加到路径的末尾

您可以添加这行代码并获取文件的路径,然后使用VisualStudio表设计器打开此实例

或者,您可以更改连接字符串,并将其硬编码为.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上重新复制新的.exe和内容。这就是为什么有时会看到异常,而有时不会看到异常,这取决于.mdf是否被覆盖

是否应该更改这两个选项中的任何一个

这应该是可以的,但这取决于是否可以每次都从头开始。这完全取决于您,以下是您的可用选项:

复制到输出目录属性

此属性指定在何种条件下选择源 文件将被复制到输出目录。如果出现以下情况,请选择“不复制” 永远不要将文件复制到输出目录。选择“始终复制” 如果文件总是要复制到输出目录。挑选 如果文件仅在更新时复制,则复制(如果更新) 输出目录中具有相同名称的现有文件

如果要打开.mdf文件,只需在VS项目中双击它,它应该在
服务器资源管理器中打开
->
数据连接
。没有理由在设计器中打开输出文件(即.mdf的副本),我只会在项目中编辑该文件,因为您当前的设置是每次都会覆盖输出文件的主文件


我没有LINQPad的经验,所以我不能说这个应用程序是否可以连接到LocalDb实例。下面是一篇文章,介绍了如何从中执行此操作。

如果代码没有在
命令行上抛出任何异常。ExecuteOnQuery()
则查询完成,表应该在那里。这可能是因为在使用
LocalDb
时,您只是查看了错误的数据库。如果项目已将.MDF作为文件包含并标记为
var fullFilePath = System.IO.Path.Combine(System.Reflection.Assembly.GetExecutingAssembly().Location.ToString(), "AYttFM.mdf");