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






2.86/5 (32投票s)
一篇关于以编程方式使用 ADO.NET 的文章。
引言
在本文中,我将解释 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
声明为 Text
。CommandText
是一个 SQL 语句。
mycomm SqlCommand =new SqlCommand();
mycomm.CommandType=CommandType.Text;
mycomm.CommandText="SELECT TITLE,AUTHOR,PAGECOUNT,TOPIC,CODE FROM BOOKS";
为了能够声明和使用这些 ADO.NET 对象,我们必须在应用程序中包含 System.Data
和 System.Data.SqlClient
命名空间。
using System.Data;
using System.Data.SqlClient;
实际上我们有两种选择。我们可以通过 DataAdapter
对象使用 Fill
和 Update
方法来操作数据。我们使用 Fill
方法来加载和搜索应用程序中的数据,因为它很简单。作为第二个选择,我们可以使用 SqlConnection
和 SqlCommand
直接访问数据。这比第一种更快。此方法用于使用 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();
}
}
DeleteData
和 ModifyData
函数与 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 日:初步修订。