ADO.NET基础02
查询和操作数据库
要想从数据库中读取多条记录就必须用到Command对象的ExecuteReader()方法,该方法返回一个DataReader对象,通过其对象的程序就可以访问数据库。
基础知识
conn.close(); //关闭之后还能打开;
conn.dispose(); //直接销毁不能再次利用,dispose内部有close方法;
认识DataReader对象
使用其DataReader对象可以从数据库中检索只读数据,且每次只能从查询结果中读取一行到内存中,非常的快,使用其时不能对其进行修改,只能读取。而且在读取是一定要与数据库连接,不能断开连接。
要创建一个DataReader对象需要调用Command对象的ExecuteRead()方法,此方法返回值就是一个DataReader对象,之后调用其对象的Reader()方法来读取一行数据,{将其放在一个while循环中,这样就可以将所有的值全部都显示出来}
步骤:
1:创建Command对象
string connSting=”Data Source=zhanghui; Initial Catalog=Ahui; User ID=sa; Pwd=111”
sqlconnection conn=new sqlconnection(connString);
conn.open();
string sql=”saelect count(*) from Student”;
sqlCommand md=new sqlCommand(sql,conn);
2:调用Command的ExecuteReader()方法创建DataReader对象。
sqlDataReader dataReader=md.ExecuteReader();
3:使用其的Read()方法按行去读取数据,此方法返回一个布尔类型,若读到数据则返回true,否则返回false,此时用到了while循环。
while(dataReader.read())
{
获取数据集中的值;
}
4:
4.1读取当前行的某列数据,可以像数组一样进行索引,按下标进行查询显示。
(string)dataReader[0];
4.2还有一种方法也可以获取当前行的某列数据。
string name=dataReader.GetString(0); //获取其第一行的值。
5:关闭其DataReader对象,调用其Close()方法。
eg one : 在前台输入用户,看是否为数据库表中的数据,若是则显示成功,不是报错。
Console.WriteLine("请输入用户名");
string username = Console.ReadLine();
//数据库连接字符串
string connString = "Data Source=zhanghui;Initial Catalog=Ahui;User ID=sa;Pwd=111";
//创建数据库的连接
SqlConnection conn = new SqlConnection(connString);
conn.Open(); //打开数据库
using (SqlCommand kfc = conn.CreateCommand()) //创建Command对象。
{
kfc.CommandText = "select * from Student where Name= '"+username +"' "; //SQL语句
using (SqlDataReader read = kfc.ExecuteReader())
{
if (read.Read())
{
Console.WriteLine("用户存在");
}
else
{
Console.WriteLine("用户错误");
}
}
}
Console.WriteLine("打开数据库连接成功");
conn.Close(); //关闭数据库,切记每次用完之后一定要关闭数据库。
Console.ReadKey();
eg two :从数据库中读取数据,显示在窗口中。
一般的注意事项
User是关键字,一般情况下表名以T_开头,字段以F_开头;,这样做的好处是防止表名与字段和系统的关键字重复,报错。
reader的GenString,GetInt32等方法只能接受整数参数,也就是序号用GetOrdinal方法根据列名动态得到序号。
特殊: eg three :
改变上一个登录程序,使用其count(*)来进行比较,来查看是否登录成功;
static void Main(string[] args)
{
Console.WriteLine("请输入用户名");
string username = Console.ReadLine();
Console.WriteLine("请输入密码");
string password = Console.ReadLine();
//数据库连接字符串
string connString = "Data Source=zhanghui; Initial Catalog=Ahui; User ID=sa; Pwd=111";
//创建数据库连接
SqlConnection conn=new SqlConnection(connString);
//打开数据库
conn.Open();
using (SqlCommand ka=conn.CreateCommand())
{
ka.CommandText = "select count(*) from login where UserName='"+username+"' and Password='"+password+"' ";
//当时在做的时候,不知道在UserName和Password之间加and,花费了很多的时间,最后才知道了,这是SQL语法里面的知识。
int i = Convert.ToInt32(ka.ExecuteScalar());
//在这里的ka.ExecuteScalar()代表的就是ka.Command里面传出来的值。
if (i>0)
{
Console.WriteLine("登录成功");
}
else
{
Console.WriteLine("用户名或密码错误?");
}
}
Console.WriteLine("OK");
Console.ReadKey();
但是为什么我这样子输入的话,也会出现登录成功。
老师说这是一种注入漏洞,只要是登录名和数据库中的登录名一样,就可以显示登录成功。
但是如果想避免情况的发生,就必须使用参数化查询。
eg:
static void Main(string[] args)
{
Console.WriteLine("请输入用户名");
string username = Console.ReadLine();
Console.WriteLine("请输入密码");
string password = Console.ReadLine();
//数据库连接字符串
string connString = "Data Source=zhanghui; Initial Catalog=Ahui; User ID=sa; Pwd=111";
//创建数据库连接
SqlConnection conn=new SqlConnection(connString);
//打开数据库
conn.Open();
using (SqlCommand ka=conn.CreateCommand())
{
ka.CommandText = "select count(*) from login where UserName=@UserName and Password=@Password";
//上面的可以先看成占位符,通过下面的语句在给其赋值,。
ka.Parameters.Add(new SqlParameter("UserName",username));
//Parameters是其ka的一个属性,是一个集合,通过调用Add来为其上面的占位符来赋值。
ka.Parameters.Add(new SqlParameter("Password",password));
int i = Convert.ToInt32(ka.ExecuteScalar());
if (i>0)
{
Console.WriteLine("登录成功");
}
else
{
Console.WriteLine("用户名或密码错误?");
}
}
Console.WriteLine("OK");
Console.ReadKey();
上面的修改,是用了其试占位符的字段,来赋值,不是用参数的形式来设值,这样子就堵注了SQL漏洞攻击;
在其占位符下面在为其占位符赋值,是将拿输入的东西当成字符串的值,在数据库中进行比较,如果有则登陆成功,否则登录失败。
***在同一个连接中如果sqlDataReader没有关闭,那么是不能执行update之类的语句;
下面是一个登录的实例,但是出现不了自己想要的结果,总是说出错,有谁做过可以帮我看看,谢谢。
代码:
/*将第二个要用的数据库连接必须重新写在一个类中,进行调用,如果在一个数据库连接字符串中
同时进行两个sql语句的操作就会出现错误。
这样就相当于将其封装起来,如果后面要用到,直接调用就行。
*/
private void hui()
{
string connSting = "Data Source=zhanghui; Initial Catalog=Ahui; User ID=sa; Pwd=111;";
SqlConnection conn = new SqlConnection(connSting);
conn.Open();
using (SqlCommand updata = conn.CreateCommand())
{
updata.CommandText = "update login Set errorTimes=errorTimes+1 where UserName=@UserName ";
updata.Parameters.Add(new SqlParameter("UserName", txtUserName.Text));
updata.ExecuteNonQuery();
}
}
private void btnLand_Click(object sender, EventArgs e)
{
string connString = "Data Source=zhanghui; Initial Catalog=Ahui; User ID=sa; Pwd=111;";
SqlConnection conn=new SqlConnection(connString);
conn.Open();
using (SqlCommand lg=conn.CreateCommand())
{
lg.CommandText = "select * from login where UserName=@UserName";
lg.Parameters.Add(new SqlParameter("UserName",txtUserName.Text));
using (SqlDataReader reader=lg.ExecuteReader())
{
if (reader.Read())
{
int errorTime = reader.GetInt32(reader.GetOrdinal("errorTimes"));
if (errorTime > 3)
{
MessageBox.Show("登陆次数过多,禁止登录!");
return;
}
string AhuiPassword = reader.GetString(reader.GetOrdinal("Password"));
if (AhuiPassword==txtPassword.Text)
{
MessageBox.Show("登陆成功");
}
else
{
hui(); //调用了本类中上面的一个类。
MessageBox.Show("登录失败");
}
}
else
{
MessageBox.Show("用户名不存在");
}
}
}
}
下面为数据库截图和登录窗口截图
运行结果如下,刚开始还可以运行3次,说是登录失败,现在只要是输入就说登录此数过多,求大神支招
这个问题我自己一直解决不了,困扰我了很久,希望遇到大神,帮帮我。谢了。
ADO.NET基础02的更多相关文章
- ADO.NET基础02(语句参数化,配置文件,DataSet与DataTable)
ADO.NET连接池 ado.net默认启用了连接池 *如何清空连接池?Connection的静态方法ClearAllPools(). ClearPool() Ado.net连接池使用总结: 1.第一 ...
- javascript基础02
javascript基础02 1.数据类型 数据类型的描述在上篇的扩展中有写到链接 由于ECMAScript数据类型具有动态性,因此的确没有再定义其他数据类型的必要.这句话很重要. 如果以后再数据类型 ...
- javaSE基础02
javaSE基础02 一.javac命令和java命令做什么事情? javac:负责编译,当执行javac时,会启动java的编译程序,对指定扩展名的.java文件进行编译,生成了jvm可以识别的字节 ...
- ADO.NET基础03
数据库和VS的连接,实现数据的同步,让用户的一切信息都可以在数据库中留下记录. ADO.NET基础 它是连接所有数据库的一种特殊的技术,提供对不同的数据库统一操作接口. 在VS中也可以添加数 ...
- java基础学习05(面向对象基础02)
面向对象基础02 实现的目标 1.String类的使用2.掌握this关键字的使用3.掌握static关键字的使用4.了解内部类 String类 实例化String对象一个字符串就是一个String类 ...
- .Net Core 系列:2、ADO.Net 基础
目录: 1.环境搭建 2.ADO.Net 基础 3.ASP.Net Core 基础 4.MD5.Sha256.AES 加密 5.实现登录注册功能 6.实现目录管理功能 7.实现文章发布.编辑.阅览和删 ...
- 有关ADO.NET基础中的基础的熟悉过程
现在对于ADO.NET基础的理解与记忆并不严谨和完善 所以,只写一点关于自己的理解,嗯,一种去转换思维理解的方法吧,算是吧 希望各位前辈或者同学,积极指出其中的错误和偏差 个人对于刚接触的ADO.NE ...
- 如鹏网学习笔记(六)ADO.Net基础
ADO.Net基础 一.ADO.Net简介 1,程序要通过SQL语句自动化的操作数据库,必须要用一个类库, 类库要提供execute("insert into ...")/exec ...
- ADO.NET基础开发
ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写.ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供了一个面向对象的数据访问架构, ...
随机推荐
- ENode 1.0 - 事件驱动架构(EDA)思想的在框架中如何体现
开源地址:https://github.com/tangxuehua/enode 上一篇文章,我给大家分享了我的一个基于DDD以及EDA架构的框架enode,但是只是介绍了一个大概.接下来我准备用很多 ...
- C#函数式编程
提起函数式编程,大家一定想到的是语法高度灵活和动态的LISP,Haskell这样古老的函数式语言,往近了说ruby,javascript,F#也是函数式编程的流行语言.然而自从.net支持了lambd ...
- [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用
[.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是 ...
- PosePlus的第一次突破
动作问题一定要解决 PosePlus是解决这个问题的库 (之前叫做CleanData.Ani,后来我想过,之前的设计各个库之间的依赖太重了) 现在把他们之间的依赖剥开. PosePlus解决几个问 ...
- java中基本类型和包装类型实践经验
至今,小菜用java快两年了,有些事,也该有个总结. 基本类型和包装类型的概念在本文不作赘述. 如果这两种类型直接使用,倒没什么值得讨论的,无非就是自动装箱拆箱,java可以让你感觉不到他们的存在,但 ...
- 学习Scala第一篇-从hello World开始
最近开始系统性的学习scala.其实之前使用过scala的,比如我在用Gatling这款性能测试工具的时候就接触到了scala了.Gatling本身就是用Scala写的,而且Gatling的性能测试配 ...
- iOS app 程序启动原理
iOS app 程序启动原理 Info.plist: 常见设置 建立一个工程后,会在Supporting files文件夹下看到一个"工程名-Info.plist"的文件, ...
- Windows Live Writer 初次使用
Windows Live Writer 博客园文章的一款发布器,这篇文章就是通过其发布的,可以先在word中写好博客内容,直接粘贴到这里发布就OK,之前我都是先在Word中写好一份,然后在blogs ...
- EF架构~有时使用SQL更方便
回到目录 在进行统计时,尤其是按月进行统计,由于我们采用的时间是一个2015-12-12日这种,所以在linq你无法进行拆分,你拆分了在发到SQL时也会报错,因为SQL那边更新不需要你.net的方法, ...
- Fedora Static Configure
Background Currenlty! I am work on fedora system, but the static-ip has required, but the fedora hav ...