C#学习笔记 ADO.NET

2022-05-05 18:51:21 浏览数 (1)

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;
}

0 人点赞