本文介绍如何创建带有数据库的程序(系统)方法,适合初学者学习。
文章目录
1 数据库
1.1 数据库简介
数据库(DB)是存放数据的仓库,它以文件形式存放于计算机上(区别普通文件是它们由DBMS创建、管理、维护)。数据库管理系统(DBMS)按一定的数据模型(层次模型、网状模型和关系模型)组织数据形成数据库,并对数据库进行管理。DBMS是管理DB的软件,通过数据库管理员(DBA)来主导,即
D
B
A
操
纵
→
D
B
M
S
管
理
→
D
B
DBA\underrightarrow{\quad操纵\quad}DBMS\underrightarrow{\quad管理\quad}DB
DBA操纵DBMS管理DB DB:逻辑上→容器、物理上→若干文件,其组成结构
D
B
=
1
个
行
数
据
文
件
[
.
m
d
f
]
+
(
n
−
1
)
个
辅
助
数
据
文
件
[
.
n
d
f
]
+
n
个
日
志
文
件
[
.
l
d
f
]
DB=1个行数据文件[.mdf]+(n-1)个辅助数据文件[.ndf]+n个日志文件[.ldf]
DB=1个行数据文件[.mdf]+(n−1)个辅助数据文件[.ndf]+n个日志文件[.ldf]它们通过文件组进行组织(主行数据文件放在PRIMARY文件组中)。主行数据文件存放定义数据库的信息和数据,日志文件记录操作数据库的过程。而对于FILESTREAM,应用程序借助FILESTREAM可将非结构化数据(文档、图像等)储存在文件系统中,并且保持非结构化数据与对应结构化数据之间的事务一致性。
实际应用中,数据库一般通过DBMS(计算机上安装的一或多个SQL Server (DBMS) →数据库实例)创建。项目开发前,需先建立数据库,然后基于该DB创建和管理数据表、视图等,并通过数据库对象(表/视图(虚表)/索引/约束/储存过程/触发器/默认值/用户和角色/规则/类型/函数)对DB进行操作和管理。
流行的DBMS(软件/系统)有,①本地数据库管理系统:Accesss、Visual FoxPro、Paradox;②远程数据库服务器:SQL Server、Oracle、MySQL等。远程数据库服务器在“存储量”、“并发访问”等方面更强!
1.2 数据库如何储存数据
项目开发前,首先通过数据库管理系统(如SQLServer的管理系统是SQLServer Management Studio(SSMS))创建数据库DB(在计算机物理内存中为1个.mdf文件和1个.ldf文件;在SSMS中为一个树状的分层结构)。然后在DB的基本上设计表及其约束,并创建之。最后往数据库的数据表(若干张)中编辑数据(①手动输入—少量数据;②利用SSMS的数据导入接口—批量数据)。
1.3 数据库操纵语言:T-SQL
T-SQL 即 Transact-SQL,是 SQL 在 Microsoft SQL Server 上的增强版,它是用来让应用程序与 SQL Server 沟通的主要语言(将T-SQL语句嵌入应用程序语句中,如T-SQL语句嵌入C#、Java或Python中)。T-SQL 提供标准 SQL 的 DDL 和 DML 功能,加上延伸的函数、系统预存程序以及程式设计结构(例如 IF 和 WHILE)让程式设计更有弹性。
2 程序(如C#)如何与数据库打交道?
2.1 总体交互简介
C#程序与数据库打交道主要分为两种模式:①连接式模式(DataReader)、②断开模式(DataSet)。一般说来,ADO.NET工作流程为:
连
接
对
象
→
命
令
对
象
→
D
a
t
a
R
e
a
d
e
r
/
D
a
t
a
A
d
a
p
t
e
r
执
行
连接对象→命令对象→DataReader/DataAdapter执行
连接对象→命令对象→DataReader/DataAdapter执行其中,连接对象创建:SqlConnection 连接对象=new SqlConnection(”连接字符串”)
,命令对象创建:SqlCommand 命令对象名=new SqlCommand(“查询字符串”,连接对象名)
。
2.1.1 连接模式
ExecuteReader()
方法执行CommandText中定义的SQL语句或储存过程,可返回一个DataReader对象(包含了一行、多行数据记录的结果集)。使用DataReader对象的方法可对结果集中的数据进行检索。【DataReader对象是只读的、向前移动的游标;每次只能在内存中保留一行;一直保持与数据库的连接】,其使用方式为SqlDataReader 对象名=命令对象名. ExecuteReader();
。
2.1.2 断开模式
DataAdapter连接物理数据表与内存数据表。数据源→内存表:填充Fill()
,内存表→数据源:更新Update()
。DataAdapter可使用Connection对象连接到数据源,使用Command对象从数据源检索数据,以及将更改回写数据源。适配器创建语法为:SqlDataAdapter 对象名=new SqlDataAdapter(SqlStr,conn);
,参数SqlStr为SELECT查询语句或SqlCommand对象,conn为SqlConnection对象。
DataTable为内存中的一个关系数据库表,可独立创建也可由DataAdapter来填充,声明语法为:DataTable dt=new DataTable();
。两种使用情境:①连接数据源、创建适配器对象后,可用其Fill()方法来填充dt,然后再将dt作为数据显示控件(如DataGridView)的数据源。②连接数据源、创建适配器对象后(+适配器画刷),用其Fill()方法来填充dt,再于程序中更改dt(断开连接模式),最后用da.Update(dt)更新至数据源/库。
2.2 DataReadr连接式模式示例
说明:①connstr为App.config中的连接字符串;②GetData为一个储存过程。
private void button1_Click(object sender, EventArgs e)
{
string connstr = ConfigurationManager.ConnectionStrings["myConnString"].ToString();
//使用using语句可在语句块结束后自动关闭数据库连接
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlCommand cmd = new SqlCommand("GetData", conn);
cmd.CommandType = CommandType.StoredProcedure; //命令是储存过程
cmd.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 10)); //@name为储存过程参数-需同名
cmd.Parameters["@name"].Value = textBox1.Text;
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
if(!dr.HasRows)
{
MessageBox.Show("未找到符合条件的记录", "出错", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
BindingSource bs = new BindingSource();
bs.DataSource = dr;
dataGridView1.DataSource = bs;
}
}
2.3 DataSet非连接式模式示例
//(4)添加新用户
public string AddUser(ArrayList valList)
{
string msg;
try
{
SqlDataAdapter sda = new SqlDataAdapter();
string SelectStr = "SELECT * FROM Admin"; //所有的记录
sda.SelectCommand = new SqlCommand(SelectStr, conn);
SqlCommandBuilder scb = new SqlCommandBuilder(sda); //命令画刷
DataSet ds = new DataSet();
sda.Fill(ds);
DataRow newRow = ds.Tables[0].NewRow(); //依“模表”建“行”
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
newRow[i] = valList[i]; //valList每个元素储存“列值”
}
ds.Tables[0].Rows.Add(newRow); //内存数据(表)变化
sda.Update(ds); //数据适配器一次性更新至数据库
msg = "用户注册成功!";
}
catch(Exception ex)
{
msg = ex.Message; //错误信息
}
finally
{
conn.Close();
}
return msg;
}
3 快速入门书籍推荐
(1)SQLServer书籍。郑阿奇,等.SQL Server实用教程:SQLServer2014版。
(2)系统开发书籍(C#版)。①崔淼.C#程序设计(后2章);②龚雄涛.基于C#的SQLServer应用技术;③郭睿智.C#+SQLServer项目开发实践。④曾建华.Visual Studio 2010(C#)Web数据库项目开发。