之前学了几天的SQL Server,现在用C#代码连接数据库了。

需要使用C#代码连接数据库,读取数据。

涉及的类有:

  1. ConfigurationManage
  2. SqlConnection
  3. SqlCommand
  4. 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时应该注意以下几点:

  1. SqlDataReader对象维持了一个指针,该指针最开始指向的是结果集中的第一个元组,每次调用Reader()方法都会向下挪动指针,Reader()方法返回true则说明下面还有元组,返回false说明已经读到了最后一个元组了,这个指针只能向下挪动,不能回头;

  2. SqlDataReader对象只能读数据,不能写数据;
  3. 一个SqlDataConnection只能被一个SqlDataReader对象使用,不能两个reader对象使用同一个conn对象;
  4. 使用完毕尽量显示调用Close()方法,虽然使用using代码块会自动帮你关闭;
  5. 如果要在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相关的请看下一篇博客

模拟在内存中的数据库DataSet相关类

【点击此处回到主页】

SQL Server数据库读取数据的DateReader类及其相关类的更多相关文章

  1. 漫谈可视化Prefuse(一)---从SQL Server数据库读取数据

    上篇<可视化工具solo show-----Prefuse自带例子GraphView讲解>主要介绍了整个Prefuse工具集具有的一些特征.框架的运行流程,分析并展现了官方提供的例子Gra ...

  2. sql server 随机读取数据

    --sql server 随机读取数据 * FROM [tablename] ORDER BY NEWID() pk from [tablename] ORDER BY NEWID()) --这两个方 ...

  3. Python 学习 第17篇:从SQL Server数据库读写数据

    在Python语言中,从SQL Server数据库读写数据,通常情况下,都是使用sqlalchemy 包和 pymssql 包的组合,这是因为大多数数据处理程序都需要用到DataFrame对象,它内置 ...

  4. 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图

    如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?

  5. 用SQL语句将远程SQL Server数据库中表数据导入到本地数据库相应的表中

    一.方法一 访问不同电脑上的数据库(远程访问,只好联好网就一样),如果经常访问或数据量较大,建议用链接服务器方法. 1.创建链接服务器 exec sp_addlinkedserver ‘srv_lnk ...

  6. Jmeter—8 连接microsoft sql server数据库取数据

    本文以Jmeter 连接microsoft sql server为例. 1 从微软官网下载Microsoft SQL Server JDBC Driver 地址:http://www.microsof ...

  7. Jmeter入门8 连接microsoft sql server数据库取数据

    本文以Jmeter 连接microsoft sql server为例. 1 从微软官网下载Microsoft SQL Server JDBC Driver 地址:http://www.microsof ...

  8. c# SQL Server数据库操作-数据适配器类:SqlDataAdapter

    SqlDataAdapter类主要在MSSQL与DataSet之间执行数据传输工具,本节将介绍如何使用SqlDataAdapter类来填充DataSet和MSSQL执行新增.修改..删除等操作. 功能 ...

  9. ASP.NET用SQL Server中的数据来生成JSON字符串

    原文引自:  作者: 缺水的海豚  来源: 博客园  发布时间: 2010-09-21 21:47  阅读: 6136 次  推荐: 0   原文链接   [收藏] 摘要:ExtJs用到的数据内容基本 ...

随机推荐

  1. Google HTML/CSS 编码规范

    Google HTML/CSS 规范 本文介绍了 Google 推荐的 HTML 和 CSS 编写格式规范,以建立良好的个人编码习惯. 1.通用样式规范 省略图片.样式.脚本以及其他媒体文件 URL ...

  2. vs基础:无法断点调试dll项目 无法命中

    调试vs时,经常会出现,你设置了dll项目的一些断点,可f5之后,这些断点无效.时代定制的程序组的童鞋告诉你解决方法:在解决方案上右键“属性”,点击左侧树“配置属性”-->“配置”,右侧项目列表 ...

  3. maven 配置安装

    1.下载maven http://maven.apache.org/   2.windows安装maven 解压包后配置环境变量 PATH:%M2_HOME%\bin M2_HOME:D:\soft\ ...

  4. next_permutation(全排列算法)

    STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation.首先我们必须了解什么是"下一个"排列组合,什么是"前 ...

  5. Orcale 之基本术语二

    表空间 表空间是 Orcale 数据库最大的逻辑结构.表空间就是一个或者多个数据文件的集合.所有的数据文件都被逻辑的存放在表空间中. 一个数据库包括 SYSTEM.SYSAUX和TMP三个默认表空间, ...

  6. TCP/IP协议族(三) 数字签名与HTTPS详解

    前面几篇博客聊了HTTP的相关东西,今天就来聊一聊HTTPS的东西.因为HTTP协议本身存在着明文传输.不能很好的验证通信方的身份和无法验证报文的完整性等一些安全方面的确点,所以才有了HTTPS的缺陷 ...

  7. phpcms的安装以及简单使用

    先来说一下phpcms的安装 首先从网上下个phpcms的压缩包,解压 解压后就是个这样的文件夹 这里要注意,下载的时候要放在平时存动态网页的那个地址,www目录下,如图 点开phpcms文件夹,里面 ...

  8. PHPCMS-后台管理中心

    这个就是便捷管理网页,可以通过这个后台进行修改.增删一些东西,还可以利用一些网页模板来建立网页 首先就是下载好这个后台管理中心,这个从网上下载就好了,记住这个要安装在WampServer中的www文件 ...

  9. C++程序员的阅读清单

    link:http://www.who1753.com/must-read-c-book-list/ 多读一些优秀的书籍,对于开发者稳固编程基础.提高编程技能有很大帮助.但是,大多时候,初学者不知道应 ...

  10. 读书笔记 effective c++ Item 7 在多态基类中将析构函数声明为虚析构函数

    1. 继承体系中关于对象释放遇到的问题描述 1.1 手动释放 关于时间记录有很多种方法,因此为不同的计时方法创建一个TimeKeeper基类和一些派生类就再合理不过了: class TimeKeepe ...