2017-04-24 138 views
0

我试图通过一个MDF文件创建到本地数据库,就像这样:连接到本地数据库

scon = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDBFilename=|DataDirectory|\articles.mdf; Integrated Security=True"); 
scon.Open(); 
scmd = new SqlCommand("Insert INTO articles(url) VALUES(@url)"); 
scmd.Parameters.AddWithValue("@url", "http://google.com"); 
scmd.ExecuteNonQuery(); 

MY mdf文件是在根文件夹,并在debug文件夹了。当我运行下面的代码我得到一个错误说以下内容:

enter image description here

,因为它是一个很长的URL与空间,在这里我不能使用完整的连接路径是我的文件结构:

enter image description here

我的数据库中存在:

enter image description here

我该如何解决这个问题,以便连接到我的数据库?

+0

有您尝试通过删除任何空格和其他非字母数字字符来重命名文件夹? – Hanno

回答

3

传递的连接对象给SqlCommand构造

scmd = new SqlCommand("Insert INTO articles(url) VALUES(@url)", scon); 

ConnectionString中是好的,错误消息通知你,这是不可能的,如果数据库是不知道执行命令。 SqlConnection包含这些信息,您需要将它传递给您的命令。 另一种可能性是通过

scmd.Connection = scon; 

但是,就个人而言,我更喜欢通过在构造该信息。

最后但非常重要的笔记
SqlConnection和SqlCommand是一次性对象。你应该总是处理这些类型的对象。 using语句是正确的方法

using(scon = new SqlConnection(....)) 
using(scmd = new SqlCommand("Insert INTO articles(url) VALUES(@url)",scon)) 
{ 
    scon.Open(); 
    scmd.Parameters.AddWithValue("@url", "http://google.com"); 
    scmd.ExecuteNonQuery(); 
} 
+0

'SqlCommand'并不需要处理。它是可处置的唯一原因是它继承自'System.ComponentModel.Component'。在处理过程中'SqlCommand'和'DbCommand'都没有做任何事情。当你处理一个命令时唯一发生的事情是[你导致'.Disposed'事件被触发,一个名为'_cachedMetaData'的内部变量被设置为空](http://referencesource.microsoft.com/System 。数据/系统/数据/的SqlClient/SqlCommand.cs.html#53ad9885e5a8fc48)。 –

+1

是的,这是真的。但是如果一个对象实现了IDisposable接口,如果我尊重建议的模式,我该怎么做呢?我更喜欢忽略这些内部结构 – Steve

+0

因此,您将处理您创建的每个“DataTable”,并处理从异步方法返回的每个“Task”或“Task ”? –

0

的问题,您的代码是您有一个命令和连接,但没有什么,直到命令来使用此连接对象...你可以使用SqlCommand构造要做到这一点

scmd = new SqlCommand("Insert INTO articles(url) VALUES(@url)",scon) 

,或者使用类似这样的

scmd.Connection = scon 

连接属性的SqlCommand类考虑增加Using到您的SQL连接...否则你必须手动关闭连接通过调用scon.Close(); 如果你没有做任何一个你会遇到例外,如果你试图打开连接时,它已经打开