在C#中处理数据库混淆

时间:2012-10-09 11:26:07

标签: c# ado.net

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

6 个答案:

答案 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那样连接到数据库。您已提供显示文件的物理路径。

第二件事见下文:

SqlCommandBuilder Class