SQL Server数据库读取数据的DateReader类及其相关类
之前学了几天的SQL Server,现在用C#代码连接数据库了。
需要使用C#代码连接数据库,读取数据。
涉及的类有:
- ConfigurationManage
- SqlConnection
- SqlCommand
- SqlDataReader
| 类名 | 功能 | 备注 |
| ConfigurationManage | 用于读取配置文件中的数据库相关信息 | 没想到备注 |
| SqlConnection | 用于连接对应数据库 | 使用前要Open,使用完毕后尽量Close |
| SqlCommand | 用于存储要执行的sql语句,并执行sql语句,获得SQLDataReader实例或者一个int值 (该值是受影响的行数) |
每次执行前要对CommandText赋值, 也就是要执行的sql语句 |
| SqlDataReader | 一行一行的去读取数据表的元组 | 读取元组时,只能从第一个元组开始读,一次读一个元组,不能回头 |
建库建表语句:
create database student;
use student;
create table student(
sname nvarchar(20) not null,
sno int not null,
sage smallint not null,
ssex char(2) not null
); alter table student
add constraint PK_sno primary key (sno),
constraint CK_sage check(sage between 8 and 40),
constraint CK_ssex check(ssex = '男' or ssex = '女') insert into student values('张三',100, 23, '男');
insert into student values('李四',101, 24, '男');
insert into student values('王五',102, 25, '男');
insert into student values('赵六',103, 26, '男'); select * from student;
app.config配置文件中的写法:(记得要在reference中增加引用添加命名空间,System.Configuration)
关键字之间的空格也不能多,比如:data source之间只有一个空格。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<connectionStrings>
<add name="constr"
connectionString="Data Source=ANAN\SQLEXPRESS;Initial Catalog=student;integrated Security=True;"
providerName="System.Data.SqlClient" />
<!--<add name="TestConnectionString"这个是在C#代码里面获取数据库信息的key,
下面这些是数据库的一些信息:
connectionString="Data Source=你的数据库实例名;
Initial Catalog=数据库名字;(这里不是表名,记住)
User ID=sa;
Password=你自己的密码"
providerName="System.Data.SqlClient"
也可以不使用密码账号登录,使用Windows用户登录也可以/>-->
<!--
integrated Security=True;
这里是使用Windows验证的方式去连接到数据库服务器。
这样方式的好处是不需要在连接字符串中编写用户名和密码,
从一定程度上说提高了安全性。
-->
<!--
providerName="System.Data.SqlClient" 说明使用的是MSSQLServer数据库
providerName="System.Data.SqlLite" 说明使用的是SQLLite数据库
providerName="System.Data.OracleClient" 说明使用的是Oracle数据库
providerName="System.Data.Oracle.DataAccess.Client" 同上,Oracle数据库
providerName="System.Data.OleDb" 说明使用的是Access数据库
-->
</connectionStrings>
</configuration>
连接数据库的写法,这里只是把数据打印出来,没有做任何操作:
private static void SqlConnPrint()
{
StringBuilder sb = new StringBuilder("姓名\t学号\t年龄\t性别\n");
//第一步:读取配置文件
string str = ConfigurationManager.ConnectionStrings["constr"].ToString();
//string str = @"Data Source=ANAN\SQLEXPRESS;Initial Catalog=student;Persist Security Info=True;";
//第二步:创建数据库连接对象conn
using (SqlConnection conn = new SqlConnection(str))
{
//第三步:打开数据库
conn.Open();
//第四步:创建执行sql语句的cmd对象
using (SqlCommand cmd = conn.CreateCommand())
{
//第五步:构建要执行的sql语句
cmd.CommandText = "select * from student";
//第六步:执行sql语句,拿到reader对象
using (SqlDataReader reader = cmd.ExecuteReader())
{
//第七步:读取数据
while (reader.Read())
{
sb.Append(reader.GetString(reader.GetOrdinal("sname")))//获取列信息的第一种方式(知道列名)
.Append("\t")
.Append(reader["sno"])//第二种方式(知道列名)
.Append("\t")
.Append(reader[2])//第三种方式(列的知道位置,即第几列)
.Append("\t")
.Append(reader.GetString(reader.GetOrdinal("ssex")))
.Append("\n");
}
Console.WriteLine(sb);
}
}
}
}
打印的结果:

总结下使用SqlDataReader时应该注意以下几点:
- SqlDataReader对象维持了一个指针,该指针最开始指向的是结果集中的第一个元组,每次调用Reader()方法都会向下挪动指针,Reader()方法返回true则说明下面还有元组,返回false说明已经读到了最后一个元组了,这个指针只能向下挪动,不能回头;
- SqlDataReader对象只能读数据,不能写数据;
- 一个SqlDataConnection只能被一个SqlDataReader对象使用,不能两个reader对象使用同一个conn对象;
- 使用完毕尽量显示调用Close()方法,虽然使用using代码块会自动帮你关闭;
- 如果要在SqlDataReader对象还未读取完所有的结果集就要关闭SqlDataReader对象,则一个先调用Command对象的Cancel()方法,然后再显示调用SqlDataReader对象的Close()方法。
做个一个测试,SqlDataReader是否每次调用Reader()方法都会去数据库中读取,结果是没有,它是将数据读到一个缓冲区,然后一行一行读取这个缓冲区,所以最上面的表格中说一行行的读取元组并不准确。
代码上来先:
public static void ProveSqlDataReader()
{
String connStr = ConfigurationManager.ConnectionStrings["connStr"].ToString();
SqlConnection conn = new SqlConnection(connStr);
SqlConnection conn2 = new SqlConnection(connStr);
conn.Open();
conn2.Open();
SqlCommand cmd = new SqlCommand("select * from student", conn);
SqlCommand cmd2 = new SqlCommand("delete student;", conn2);
SqlDataReader reader = cmd.ExecuteReader();
cmd2.ExecuteNonQuery();//这里将数据库中的数据全删除了,但是还是打印输出了数据表中的数据。
while (reader.Read())
{
Console.WriteLine("数据: " + reader[0]);
}
conn.Close();
conn2.Close();
}
有关于DataSet相关的请看下一篇博客
SQL Server数据库读取数据的DateReader类及其相关类的更多相关文章
- 漫谈可视化Prefuse(一)---从SQL Server数据库读取数据
上篇<可视化工具solo show-----Prefuse自带例子GraphView讲解>主要介绍了整个Prefuse工具集具有的一些特征.框架的运行流程,分析并展现了官方提供的例子Gra ...
- sql server 随机读取数据
--sql server 随机读取数据 * FROM [tablename] ORDER BY NEWID() pk from [tablename] ORDER BY NEWID()) --这两个方 ...
- Python 学习 第17篇:从SQL Server数据库读写数据
在Python语言中,从SQL Server数据库读写数据,通常情况下,都是使用sqlalchemy 包和 pymssql 包的组合,这是因为大多数数据处理程序都需要用到DataFrame对象,它内置 ...
- 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图
如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?
- 用SQL语句将远程SQL Server数据库中表数据导入到本地数据库相应的表中
一.方法一 访问不同电脑上的数据库(远程访问,只好联好网就一样),如果经常访问或数据量较大,建议用链接服务器方法. 1.创建链接服务器 exec sp_addlinkedserver ‘srv_lnk ...
- Jmeter—8 连接microsoft sql server数据库取数据
本文以Jmeter 连接microsoft sql server为例. 1 从微软官网下载Microsoft SQL Server JDBC Driver 地址:http://www.microsof ...
- Jmeter入门8 连接microsoft sql server数据库取数据
本文以Jmeter 连接microsoft sql server为例. 1 从微软官网下载Microsoft SQL Server JDBC Driver 地址:http://www.microsof ...
- c# SQL Server数据库操作-数据适配器类:SqlDataAdapter
SqlDataAdapter类主要在MSSQL与DataSet之间执行数据传输工具,本节将介绍如何使用SqlDataAdapter类来填充DataSet和MSSQL执行新增.修改..删除等操作. 功能 ...
- ASP.NET用SQL Server中的数据来生成JSON字符串
原文引自: 作者: 缺水的海豚 来源: 博客园 发布时间: 2010-09-21 21:47 阅读: 6136 次 推荐: 0 原文链接 [收藏] 摘要:ExtJs用到的数据内容基本 ...
随机推荐
- 通过判断cookie过期方式向Memcached中添加,取出数据(Java)
应用场景:在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够 ...
- Quartz_理解3
什么是Quartz Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作. Quartz能干什么/应用场景 如网页游戏中 ...
- vb是如何连接数据库的
vb是如何连接数据库的 刚开始学习数据库时 ,对数据库很不了解,尤其是模块中的代码.照着抄都有很多错的,每一句到底是什么意思呢,根本不懂.于是我就花费了大量的时间去查每一句代码的具体作 ...
- windows下搭建Nexus3私服和基于IDEA15的Maven学习笔记
搭建Nexus私服. 首先去官网下载window下用的zip文件.https://www.sonatype.com/download-oss-sonatype. 解压之后包含下面两个文件 进入nexu ...
- Android系统之灯光系统--通知灯深入分析
Android通知灯的深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 getSystemService(通知服务) 构造notification 类别 其他参数(颜色,onMS,of ...
- JavaSE学习笔记
1.数据类型 boolean char byte short int long double float double array class interface 总结: 前9种基本类型,后3中引用类 ...
- event.target的第一次
今天在学习其他人代码的时候见到了event.target.nodeName,event.target.dataset.刚开始是一头雾水,便google一下.发现大多数给出的词条都是有关jQuery事件 ...
- Top命名的一些简单用法
1. Top命令的显示 top 2. 按(Shift + O)是为了选择列进行排序.例如:按a是为了通过PID进行排序.然后按任意键返回主窗口. 3. 显示特定用户的进程. top -u hadoop ...
- jQuery_第一章_JavaScript基础
JavaScript基础 JavaScript不难,但是对于初学者来讲比较的怪异. 是一种客户端语言,在浏览器执行的.是一种脚本语言,直接就能解释执行的叫脚本代码.像dos命令还有SQL也是. 为什么 ...
- Codeforces Round #383 Div 1题解
第一次打Div 1,感觉还是挺难的..把基础题打完就日常划水了.... [A. Arpa's loud Owf and Mehrdad's evil plan](http://codeforces.c ...