65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 以编程方式使用 ADO.NET

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.86/5 (32投票s)

2005年12月3日

CPOL

4分钟阅读

viewsIcon

171183

downloadIcon

3897

一篇关于以编程方式使用 ADO.NET 的文章。

Sample image

引言

在本文中,我将解释 MS ADO.NET 的基本概念以及如何以编程方式使用它。

背景

众所周知,Visual Studio .NET 通过许多向导为开发人员提供支持。其中之一就是数据窗体向导。如果您想创建涉及单表和主从详细数据库的窗体,此工具将在创建窗体时为您提供许多详细而有趣的机会。但是,当您开发实际应用程序时,通常需要更改这些标准方法以满足目标应用程序的要求。因此,您需要编写一些代码来使应用程序更具灵活性。下面是使用 C# 以完全编程方式使用 ADO.NET 的示例。

Using the Code

该程序使用一个名为“Library”的简单 SQL 数据库及其中的一个名为“Books”的表。我们可以通过几种方式创建此数据库。在收到请求后,我决定编写一些代码以编程方式创建必要的数据库。我添加了一个菜单项“Settings->Create Database”来创建数据库。

public void CreateDatabase()
{
    string sCreateDatabase="CREATE DATABASE Library";            
    string sCreateTable="CREATE TABLE Books (BookID INTEGER PRIMARY KEY IDENTITY,"+
        "Title CHAR(50) NOT NULL , Author CHAR(50), " + 
        "PageCount INTEGER,Topic CHAR(30),Code CHAR(15))" ; 
    string sInsertFirstRow="INSERT INTO BOOKS (TITLE,AUTHOR,PAGECOUNT,TOPIC,CODE)" 
        +"VALUES('Test Book','Test Author', 100, 'Test Topic', 'Test Code');";
    
    SqlConnection mycon=new SqlConnection();
    mycon.ConnectionString="workstation id=;initial catalog=; integrated security=SSPI";

    SqlCommand mycomm=new SqlCommand();
    mycomm.CommandType=CommandType.Text;
    mycomm.CommandText=sCreateDatabase;
    mycomm.Connection=mycon;

    try
    {
        //    Open the connection
        mycon.Open();
        //    Execute CreateDatabase query
        mycomm.ExecuteNonQuery();
    }
    catch
    {
        //    Catch any errors and show the error message
        MessageBox.Show(" The database already exists. ");
    }    
    finally
    {
        mycon.Close();
    }
        
    mycon.ConnectionString=
      "workstation id=;initial catalog=Library; integrated security=SSPI";
    try
    {
        //    Open the connection
        mycon.Open();
        //    Execute CreateTable query
        mycomm.CommandText=sCreateTable;
        mycomm.ExecuteNonQuery();
        //    Execute InsertFirstRow query
        mycomm.CommandText=sInsertFirstRow;
        mycomm.ExecuteNonQuery();
    }
    catch
    {
        //    Catch any errors and show the error message
        MessageBox.Show(" There is already a table named 'Books' in the database. ");
    }
    finally
    {
        mycon.Close();
    }
}

我们也可以通过 MS Visual Studio .NET 或 MS SQL Server Manager 来完成此操作。让我们在 Library 数据库中创建一个 Books 表。以下是表列

列名 数据类型 长度 允许为空
BookID int 4
标题 char 50
作者 char 50 V
PageCount int 4 V
主题 char 30 V
代码 char 15 V

首先,为了在数据存储和我们的应用程序之间移动数据,我们必须与数据存储建立连接。我们将使用 ADO.NET 中的 Connection 对象来创建和管理连接。由于我们的数据源是 SQL Server,因此我们使用 SqlConnection

SqlConnection mycon=new SqlConnection();

要确定设置,我们必须使用 ConnectionString 属性。

mycon.ConnectionString="workstation id=;initial catalog=LIBRARY; integrated security=SSPI";

DataSet 是数据的内存驻留表示,可以包含表、约束和关系。

DataSet myds=new DataSet();

DataAdapter 用于从数据源检索数据并将其填充到 DataSet 中,以及将对 DataSet 所做的更改解析回数据源。我们也可以简单地说,通过 DataAdapter 控制与数据源和数据集的交互。

SqlDataAdapter myadap=new SqlDataAdapter();

DataTable 用于表示内存驻留数据的单个表。在我们的项目中,由于数据库中只有一个表,因此我们必须创建一个表来表示数据库中的表,并将其添加到我们的 DataSet 对象中。

DataTable mytable=new DataTable("books");
myds.Tables.Add(mytable);

Command 对象用于在连接的环境中直接访问数据库中的数据。CommandType 声明为 TextCommandText 是一个 SQL 语句。

mycomm SqlCommand =new SqlCommand();
mycomm.CommandType=CommandType.Text;
mycomm.CommandText="SELECT TITLE,AUTHOR,PAGECOUNT,TOPIC,CODE FROM BOOKS";

为了能够声明和使用这些 ADO.NET 对象,我们必须在应用程序中包含 System.DataSystem.Data.SqlClient 命名空间。

using System.Data;
using System.Data.SqlClient;

实际上我们有两种选择。我们可以通过 DataAdapter 对象使用 FillUpdate 方法来操作数据。我们使用 Fill 方法来加载和搜索应用程序中的数据,因为它很简单。作为第二个选择,我们可以使用 SqlConnectionSqlCommand 直接访问数据。这比第一种更快。此方法用于使用 Command 对象的 ExecuteNonQuery 方法进行插入、删除和修改操作。我们可以创建一个类,将所有必要代码放入其中,并将一些必要项设置为 public,以便在命名空间中的任何地方都能访问它们。

public class dataManipulationClass
{
    public SqlConnection mycon;
    public DataSet myds;
    public DataTable mytable;
    public SqlDataAdapter myadap;
    public SqlCommand mycomm;        

    public bool ManupulateData()
    {
        mycon=new SqlConnection();
        mycon.ConnectionString="workstation id=;initial catalog=LIBRARY;
            integrated security=SSPI";
                    
        myds=new DataSet();
        mytable=new DataTable("books");
        myds.Tables.Add(mytable);
        myadap=new SqlDataAdapter();

        mycomm=new SqlCommand();
        mycomm.CommandType=CommandType.Text;
        mycomm.CommandText="SELECT TITLE,AUTHOR,PAGECOUNT,TOPIC,CODE FROM BOOKS";
        mycomm.Connection=mycon;
        myadap.SelectCommand=mycomm;

        return true;
    }
}

要在 FormMain 类中使用此类,我们必须声明它。

dataManipulationClass cDataMan=new dataManipulationClass();

要加载数据,我们有一个简单的 LoadData 函数。

public void LoadData()
{
    //    Call method to initialize the parameters of dataManipulationClass object
    cDataMan.ManupulateData();
    //    Bound dataGrid to dataset 
    dataGrid.DataSource=cDataMan.myds;
    //    Set DataMember to books table
    dataGrid.DataMember="books";        
    try
    {
        //    Get data from table and fill the table in the dataset via dataadapter
        cDataMan.myadap.Fill(cDataMan.mytable);
    }
    catch(Exception xcp)
    {
        //    Catch any errors and show the error message
        MessageBox.Show(xcp.ToString());
    }
    finally
    {
        //    Close the connection
        cDataMan.mycon.Close();
    }
}

DeleteDataModifyData 函数与 AddData 非常相似,除了它们的连接字符串。连接字符串用于 DeleteData 函数。

cDataMan.mycomm.CommandText="DELETE FROM BOOKS WHERE BOOKID=@BookID";

已将 SqlParameter 添加到 BookID 的字符串中。

cDataMan.mycomm.Parameters.Add(new SqlParameter("@BookID",sBookID));

连接字符串用于 ModifyData 函数。

cDataMan.mycomm.CommandText="SELECT TITLE,AUTHOR,PAGECOUNT,"
    +"TOPIC,CODE FROM BOOKS WHERE TITLE=@Title";

然后将 SqlParameter 添加到字符串中。

cDataMan.mycomm.Parameters.Add(new SqlParameter("@Title",sTitle));

结论

我认为这段代码可以用于生成代码和应用程序,而无需设计时数据对象替换和无向导的应用程序开发(有时会生成不清晰的代码)。代码很简单,当然,应该进行改进以克服您的实时问题。我知道我的代码还有很多工作要做。我计划将来改进我的代码,并期待您的帮助。

历史

  • 2005 年 12 月 14 日:创建了参数化 SQL 查询。添加了数据库创建功能,以创建本文所需的数据库。修复了 Delete 和 Modify 函数,以在 DataGrid 上进行精确选择。
  • 2005 年 12 月 3 日:初步修订。

来源

© . All rights reserved.