设为首页 收藏本站
查看: 733|回复: 0

[经验分享] SQL Server数据库读取数据的DateReader类及其相关类

[复制链接]

尚未签到

发表于 2017-12-7 21:34:18 | 显示全部楼层 |阅读模式
  之前学了几天的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);
}
}
}
}  打印的结果:
DSC0000.jpg

  总结下使用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相关的请看下一篇博客
  模拟在内存中的数据库DataSet相关类
  【点击此处回到主页】

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421925-1-1.html 上篇帖子: windows安装和配置nginx 下篇帖子: JanusGraph Server配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表