简易登录页面原理
private void button1_Click(object sender, EventArgs e) { string tname = textBox1.Text.Trim(); string tpwd = textBox2.Text.Trim(); SqlConnection conn = new SqlConnection("server=PC201609230944\SQL2005;database=HeiMaBlog;user=sa;pwd=123456"); string sql = string.Format("select count(id) from Student where Name = '{0}' and Pwd = '{1}'",tname,tpwd); SqlCommand cmd = new SqlCommand(sql,conn); conn.Open(); object obj = cmd.ExecuteScalar(); int res = Convert.ToInt32(obj); if (res > 0) { MessageBox.Show("登录成功"); } else { MessageBox.Show("登录失败"); } }
SqlDataReader
不能手动直接NEW,,因为它是直接读取数据库的,而且是读取的一个指针指向的内存,如果让用户直接new,那么就可能出现不赋值的情况。
Reader在读取数据的过程当中,Connection是不能中断的,要保持连接,不能手动关闭,断网也会报错。
GetDateTime,GetInt32等方法,是方便我们去到想要的数据的指定的类型,因为我们在程序执行之前就已经知道了查询结果集里面有多少个列,每一个列是什么类型的,所以我们在这里就可以直接去到相应的类型。
DataReader也是需要关闭的
DataReader 必须独享一个Connection:因为在数据读取的过程当中不能断,如果这个conn被其他的命令对象使用,那么可能出现,还在读数据,但是另外的命令对象执行完了并且关闭了conn,那么读取器这边就报错了。
private void button12_Click(object sender, EventArgs e) { string connStr = "server=PC201609230944\SQL2005;database=HeiMaBlog;user=sa;pwd=123456"; using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = conn; cmd.CommandText = "insert into Classes values('a',100)"; cmd.ExecuteNonQuery(); } string sql = "select * from Student"; using (SqlCommand cmd = new SqlCommand(sql, conn)) { conn.Close();// 断开后二次连接 conn.Open(); using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { Console.WriteLine(Convert.ToInt32(dr["id"])+dr["Name"].ToString()+dr.GetInt32(0)); } MessageBox.Show(conn.State.ToString()); dr.Dispose(); } } } }
CommandBehavior 枚举:成员名称 说明 Default 此查询可能返回多个结果集。
执行查询可能会影响数据库状态。
Default 不设置 CommandBehavior 标志,因此调用 ExecuteReader(CommandBehavior.Default) 在功能上等效于调用 ExecuteReader()。
SingleResult 查询返回一个结果集。
SchemaOnly 查询仅返回列信息。
当使用 SchemaOnly 时,用于 SQL Server 的 .NET Framework 数据提供程序将在要执行的语句前加上 SET FMTONLY ON。
KeyInfo 此查询返回列和主键信息。
SingleRow 查询应返回一行。执行查询可能会影响数据库的状态。
一些 .NET Framework 数据提供程序可能(但不要求)使用此信息来优化命令的性能。
用 OleDbCommand 对象的 ExecuteReader 方法指定 SingleRow 时,用于 OLE DB 的 .NET Framework 数据提供程序使用 OLE DB IRow 接口(如果可用)执行绑定。否则,它使用 IRowset 接口。
如果您的 SQL 语句应该只返回一行,则指定 SingleRow 还可以提高应用程序性能。
在执行返回多个结果集的查询时,可以指定 SingleRow。在这种情况下,仍返回多个结果集,但每个结果集只有一行。
SequentialAccess 提供一种方法,以便 DataReader 处理包含带有大二进制值的列的行。SequentialAccess 不是加载整行,而是使 DataReader 将数据作为流来加载。然后可以使用 GetBytes 或 GetChars 方法来指定开始读取操作的字节位置以及正在返回的数据的有限的缓冲区大小。 CloseConnection 在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。
cmd.CommandText = "select * from [user]"; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader.GetString(1)); } } if exists(select * from sysobjects where name='user') drop table [user]
go create table [user] ( uId int identity(1,1) primary key, uUserName nvarchar(20) not null, uPwd varchar(10) ) go insert into [user] (uUserName,uPwd) values ('admin','123456') insert into [user] (uUserName,uPwd) values ('user','123456')
SqlDataReader使用注意事项
private void button13_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection("server=PC201609230944\SQL2005;database=HeiMaBlog;user=sa;pwd=123456"); SqlCommand cmd = new SqlCommand("select * from Student",conn); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while(dr.Read()) { if (!(dr[5] is DBNull)) // 判断是否为空 { Console.WriteLine(dr[1].ToString() + "|" + Convert.ToInt32(dr[5])); } } }
NextResult():可以让读取器行进到下一个结果集,因为我们的查询语句可以返回多个结果集,当一个结果集用read()遍历玩了,那么这个read会返回一个false,所以我们就知道要切换结果集了
private void button13_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection("server=PC201609230944\SQL2005;database=HeiMaBlog;user=sa;pwd=123456"); SqlCommand cmd = new SqlCommand("select * from Student;select * from Classes",conn); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while(dr.Read()) { if (!(dr[5] is DBNull)) { Console.WriteLine(dr[1].ToString() + "|" + Convert.ToInt32(dr[5])); } } dr.NextResult(); //切换到下一个列表,下一个结果集 while (dr.Read()) { if (!(dr[1] is DBNull)) { Console.WriteLine(dr[1].ToString()); } } }
// 简易错误版的登录,改变它
private void button1_Click(object sender, EventArgs e) { string tname = textBox1.Text.Trim(); string tpwd = textBox2.Text.Trim(); SqlConnection conn = new SqlConnection("server=PC201609230944\SQL2005;database=HeiMaBlog;user=sa;pwd=123456"); string sql = string.Format("select count(id) from Student where Name = '{0}' and Pwd = '{1}'",tname,tpwd); SqlCommand cmd = new SqlCommand(sql,conn); conn.Open(); object obj = cmd.ExecuteScalar(); int res = Convert.ToInt32(obj); if (res > 0) { MessageBox.Show("登录成功"); } else { MessageBox.Show("登录失败"); } }
private void button2_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection("server=PC201609230944\SQL2005;database=HeiMaBlog;user=sa;pwd=123456"); SqlCommand cmd = new SqlCommand("select count(id) from Student where Name=@ass and Pwd=@add",conn);
// 将参入引入进来,不拼接字符串了。 SqlParameter sp = new SqlParameter("@ass",textBox1.Text.Trim()); SqlParameter sp2 = new SqlParameter("@add", textBox2.Text.Trim()); cmd.Parameters.Add(sp); cmd.Parameters.Add(sp2); conn.Open(); MessageBox.Show(cmd.ExecuteScalar().ToString()); }
private void button2_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection("server=PC201609230944\SQL2005;database=HeiMaBlog;user=sa;pwd=123456"); SqlCommand cmd = new SqlCommand("select count(id) from Student where Name=@ass and Pwd=@add",conn); //// 第一种写法 //SqlParameter sp = new SqlParameter("@ass",textBox1.Text.Trim()); //SqlParameter sp2 = new SqlParameter("@add", textBox2.Text.Trim()); //cmd.Parameters.Add(sp); //cmd.Parameters.Add(sp2); ////第二种写法 //cmd.Parameters.Add(new SqlParameter("@ass",textBox1.Text.Trim())); //cmd.Parameters.Add(new SqlParameter("@add",textBox2.Text.Trim())); ////第三种写法 //SqlParameter[] spa = new SqlParameter[] //{ // new SqlParameter("@ass",textBox1.Text.Trim()), // new SqlParameter("@add",textBox2.Text.Trim()) //}; //cmd.Parameters.AddRange(spa); ////第四种写法 //cmd.Parameters.AddWithValue("@ass", textBox1.Text.Trim()); //cmd.Parameters.AddWithValue("@add",textBox2.Text.Trim()); ////第五种写法,参数可以为输出参数 //SqlParameter sp = new SqlParameter("@ass",SqlDbType.NVarChar); //SqlParameter sp2 = new SqlParameter("@add",SqlDbType.Char); //sp.Value = textBox1.Text.Trim(); //sp2.Value = textBox2.Text.Trim(); //cmd.Parameters.Add(sp); //cmd.Parameters.Add(sp2); //第六种写法 SqlParameter sp = new SqlParameter("@ass", SqlDbType.NVarChar) { Value = textBox1.Text.Trim() }; SqlParameter sp2 = new SqlParameter("@add", SqlDbType.Char) { Value = textBox2.Text.Trim() }; cmd.Parameters.Add(sp); cmd.Parameters.Add(sp2); conn.Open(); MessageBox.Show(cmd.ExecuteScalar().ToString()); }
大项目用第五种,小项目用第二种就可以。