ADO.NET是一项.NET数据库的技术,就像Java的JDBC一样。连接数据库字符串,可以在http://www.connectionstrings.com/ 这个网站上找到。不同的数据库需要不同的数据库提供程序,它们的名字都很类似。例如,Sql Server提供程序的Command类就叫做SqlCommand,MySQL提供程序的Command类就叫做MySQLCommand,它们都继承自DbCommand类。除了提供公共的功能之外,数据库提供程序还可能提供了自己数据库的特有功能。
SQL SERVER数据库
ADO.NET附带了SQL SERVER、ODBC和OLE DB的数据库提供程序。所以在使用SQL SERVER的时候不需要安装额外的数据库提供程序。在这里,我使用的是Sql Server 2014 Developer。
准备工作
首先需要确定自己的SQL SERVER实例的名字,名字可以在SQL SERVER管理工具中的数据库属性那里找到。对应的连接字符串如下:Server=myServerNamemyInstanceName;Database=myDataBase;User Id=myUsername;
Password=myPassword;
,将其修改为自己的实例:Server=LEO-PCSQLEXPRESS;Database=test;User Id=sa;Password=123456;
。SQL SERVER还支持另外一种登录方式——利用Windows凭据登录。如果要使用这种登录方式,去掉连接字符串中的用户名和密码部分,然后添加一个Integrated Security=SSPI;
。连接字符串可以在VS的数据库窗口的属性上查看。
为了测试,我们首先先建立一个自己的数据库,名字叫test,利用管理工具提供的图形化界面很容易做到。然后再新建一张表:
代码语言:javascript复制CREATE TABLE STUDENT(
SNO CHAR(10),
SNAME VARCHAR(20),
AGE SMALLINT,
CONSTRAINT STUDENT_PK PRIMARY KEY(SNO)
);
然后在插入几条数据:
代码语言:javascript复制INSERT INTO STUDENT
(SNO, SNAME, AGE)
VALUES ('12345', '易天', 22);
INSERT INTO STUDENT
(SNO, SNAME, AGE)
VALUES ('12346', '张三', 21);
INSERT INTO STUDENT
(SNO, SNAME, AGE)
VALUES ('12347', '赵四', 23);
这样,数据库的准备工作就完成了。
连接数据库
直接使用连接字符串
有了连接字符串,就可以连接数据库了。连接数据库使用DbConnection对象。直接用连接字符串创建一个SQLConnection对象即可,如果没有异常发生,就说明连接成功。
代码语言:javascript复制const string connectionString = @"Server=LEO-PCSQLEXPRESS;Database=test;User Id=sa;Password=123456;";
SqlConnection sqlserver = new SqlConnection(connectionString);
用配置文件管理连接字符串
如果可能使用多个数据库,使用配置文件来管理连接字符串会更好一点。 在项目的App.config文件中找到configuration节点,在其中添加一个子结点connectionStrings,然后添加如下内容,就可以将连接字符串保存在配置文件中了。
代码语言:javascript复制<connectionStrings>
<add name="Sql Server Instance" providerName="System.Data.SqlClient"
connectionString="Server=LEO-PCSQLEXPRESS;Database=test;User Id=sa;Password=123456;"/>
</connectionStrings>
执行SQL命令
定义命令
执行命令需要使用DbCommand对象。首先先要定义命令。这里将SqlConnection放入using语句中,确保即使出现异常,数据库连接也可以关闭,并及时释放资源。
代码语言:javascript复制using (SqlConnection sqlserver = new SqlConnection(connectionString))
{
sqlserver.Open();
string command = "select *from student";
SqlCommand cmd = new SqlCommand(command, sqlserver);
sqlserver.Close();
}
执行命令
Command对象提供了三个方法用于执行不同的命令。
- ExecuteNonQuery方法用于执行非查询的操作,例如INSERT、DELETE、UPDATE等语句或者存储过程,会返回受影响的行数。
- ExecuteReader方法执行查询语句或者存储过程,并返回一个IDataReader类型的结果集。
- ExecuteScalar方法执行命令并返回结果集中的第一行第一列的值。
对于SQLCommand,还提供了一个额外的方法ExecuteXmlReader,它返回一个XMLReader,可以将SQL数据库的内容转化成Xml格式。
代码语言:javascript复制internal static void SqlServerTest()
{
const string connectionString = @"Server=LEO-PCSQLEXPRESS;Database=test;User Id=sa;Password=123456;";
try
{
using (SqlConnection sqlserver = new SqlConnection(connectionString))
{
sqlserver.Open();
//执行查询语句
string command = "select *from student";
SqlCommand cmd = new SqlCommand(command, sqlserver);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine($"SNO:{reader[0]} SNAME:{reader[1]} AGE:{reader[2]}");
}
reader.Close();
//执行插入语句
command = "insert into student(sno,sname,age) values('13245','王五',32)";
cmd = new SqlCommand(command, sqlserver);
int rows = cmd.ExecuteNonQuery();
Console.WriteLine($"受影响了{rows}行");
sqlserver.Close();
//执行ExecuteScalar
command = "select count(*) from student";
cmd = new SqlCommand(command, sqlserver);
int count = (int)cmd.ExecuteScalar();
Console.WriteLine($"总共有{count}条记录");
}
}
catch (SqlException)
{
throw;
}
}
MySQL数据库
下载数据提供程序
先查看一下是否安装了NuGet程序包管理器,如果没有安装的话,打开工具->扩展和更新,然后查找并安装NuGet包管理器。安装之后打开NuGet包管理器,查找并安装MySQL.Data包。安装成功之后就可以使用MySQL的数据提供程序来连接MySQL数据库了。当然这需要本机安装MySQL数据库或者有一个远程的数据库访问地址。
连接MySQL
MySQL的连接字符串是 Server=myServerAddress;Port=1234;Database=myDataBase;Uid=myUsername;
Pwd=myPassword;
,将其修改为自己的地址,例如我的就是这样的:Server=localhost;Port=3306;Database=test;Uid=root;Pwd=123456;
。
打开MySQL数据库,新建一个test数据库,数据表和数据仍然使用上面的student数据表。由于只使用了最简单的数据库语句,因此在这些数据库中基本是通用的。
执行命令
执行命令基本和SQL SERVER差不多,只是相关类是以MySql开头的。
代码语言:javascript复制const string connectionString = @"Server=localhost;Port=3306;Database=test;Uid=root;Pwd=123456;";
try
{
using (MySqlConnection mysql = new MySqlConnection(connectionString))
{
mysql.Open();
//执行查询命令
MySqlCommand command = new MySqlCommand("select *from student", mysql);
MySqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine($"SNO:{reader[0]} SNAME:{reader[1]} AGE:{reader[2]}");
}
reader.Close();
//执行ExecuteScalar方法
command = new MySqlCommand("select count(*) from student", mysql);
int count = Convert.ToInt32(command.ExecuteScalar());
Console.WriteLine($"总共有{count}条记录");
}
}
catch (MySqlException)
{
throw;
}
PostgreSQL
PostgreSQL的数据提供程序叫做pgsql,直接在NuGet中搜索安装即可。程序表的建立和上面的类似。因为没有使用复杂的特性,所以锁码和前面的类似。
代码语言:javascript复制const string connectionString = @"Server=127.0.0.1;Port=5432;Database=test;User Id=postgres;Password=123456;";
try
{
using (NpgsqlConnection npgsql = new NpgsqlConnection(connectionString))
{
npgsql.Open();
//执行查询命令
NpgsqlCommand command = new NpgsqlCommand("select *from student", npgsql);
NpgsqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine($"SNO:{reader[0]} SNAME:{reader[1]} AGE:{reader[2]}");
}
reader.Close();
//执行ExecuteScalar方法
command = new NpgsqlCommand("select count(*) from student", npgsql);
int count = Convert.ToInt32(command.ExecuteScalar());
Console.WriteLine($"总共有{count}条记录");
}
}
catch (NpgsqlException)
{
throw;
}