1

我正在尝试学习如何在 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 查询的那个吗?

4

6 回答 6

2

我注意到的第一件事是我不必打开和关闭数据库。

SqldataAdapter.Fill将为您打开/关闭连接。

如果在调用 Fill 之前关闭了 IDbConnection,则打开它以检索数据,然后关闭它。如果在调用 Fill 之前连接已打开,则它保持打开状态。

从您提供的选择语句的SqlCommandBuilder元数据生成 INSERT、UPDATE 或 DELETE 语句。通过这种方式,您可以调用daCustomers.Update并且对数据库所做的所有更改都DataSet将自动更新。

于 2012-10-09T11:31:29.620 回答
1

dsCustomers.Fill 为您打开和关闭连接。SqlCommandBuilder 根据您的选择语句创建插入、更新和删除。

于 2012-10-09T11:29:18.947 回答
1

当您用数据填充表时,ADO.NET 会为您处理该任务

于 2012-10-09T11:30:45.973 回答
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);
  }

这将自动关闭连接并处理,而无需您费心。

于 2012-10-09T11:38:54.350 回答
0

Fill将使所有resources locked that are involved in the process. 此外,根据 sql 设置,它也可能会阻止其他资源。

如果您将此代码用于某些实时工作..请仅在需要时选择它。

于 2012-10-09T11:42:53.443 回答
0

对于你的第一件事:

我们使用conn.open();打开连接和conn.close();关闭连接。

在您的程序中,您没有像 sqlserver 那样连接到数据库。您已提供显示的文件物理路径。

第二件事见下文:

SqlCommandBuilder 类

于 2012-10-09T11:53:07.433 回答