我正在尝试学习如何在C#中使用数据库,当我必须使用DataSet,SqlDataAdapter和SqlCommandBuilder时,我已经参与了教程。这是我在教程中的示例中编写的代码:
public void InitData() {
//instantiate the connection
conn = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=\"D:\\Projects IDE\\Visual Studio\\Exercitii\\Console.app\\WindowsFormsApplication1\\WindowsFormsApplication1\\PlanetWrox.mdf\";Integrated Security=True;User Instance=True");
//1.instantiate a new DataSet
dsCustomers = new DataSet();
//2.init SqlDataAdapter with select command and connection
daCustomers = new SqlDataAdapter("SELECT Id ,Name, SortOrder FROM Genre", conn);
// 3. fill in insert, update, and delete commands
SqlCommandBuilder cmdBldr = new SqlCommandBuilder(daCustomers);
// 4. fill the dataset
daCustomers.Fill(dsCustomers, tableName);
}
public void btnUpdateClicked(object sender, EventArgs e) {
// write changes back to DataBase
daCustomers.Update(dsCustomers, tableName);
}
这里有一些我不明白的事情:
我注意到的第一件事是我不必打开和关闭数据库。从我对数据库的有限知识我知道,为了访问数据,你必须打开一个连接到它,在你之后你必须关闭它。这必须发生在幕后的某个地方。那是什么意思?如果这样那么女巫方法呢?
第二个问题是关于SqlDataAdapter和SqlCommandBuilder。我不明白SqlCommandBuilder在这里做了什么。是不是SqlDataAdapter正在执行sql查询?
答案 0 :(得分:2)
我注意到的第一件事是我不必打开和关闭 数据库中。
SqldataAdapter.Fill
会为您打开/关闭连接。
如果在调用Fill之前关闭了IDbConnection,则会打开它 检索数据然后关闭。如果连接在Fill之前打开 被称为,它仍然是开放的。
SqlCommandBuilder
从您提供的select语句的元数据中生成INSERT,UPDATE或DELETE语句。通过这种方式,您可以调用daCustomers.Update
,并且对DataSet
所做的所有更改都将自动在数据库中更新。
答案 1 :(得分:1)
dsCustomers.Fill为您打开和关闭连接。 SqlCommandBuilder根据您的select语句创建插入,更新和删除。
答案 2 :(得分:1)
当您使用数据填充表格时,ADO.NET会为您处理该任务
答案 3 :(得分:0)
//instantiate the connection
using (SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=\"D:\\Projects IDE\\Visual Studio\\Exercitii\\Console.app\\WindowsFormsApplication1\\WindowsFormsApplication1\\PlanetWrox.mdf\";Integrated Security=True;User Instance=True"))
{
//1.instantiate a new DataSet
dsCustomers = new DataSet();
//2.init SqlDataAdapter with select command and connection
daCustomers = new SqlDataAdapter("SELECT Id ,Name, SortOrder FROM Genre", conn);
// 3. fill in insert, update, and delete commands
SqlCommandBuilder cmdBldr = new SqlCommandBuilder(daCustomers);
// 4. fill the dataset
daCustomers.Fill(dsCustomers, tableName);
}
这会自动关闭连接和Dispose,而不必为此烦恼。
答案 4 :(得分:0)
Fill
将全部resources locked that are involved in the process
。
另外,根据sql设置,它也可能会阻止其他资源。
如果您正在使用此代码进行实时工作。请仅在您需要时选择它。
答案 5 :(得分:0)
第一件事:
我们使用conn.open();
打开连接,使用conn.close();
关闭连接。
在您的程序中,您没有像sqlserver那样连接到数据库。您已提供显示文件的物理路径。
第二件事见下文: