黑马程序员--ADO.Net中的知识点和难点
1、 ADO.Net基础
程序要和数据库交互要通过ADO.Net进行,通过ADO.Net就能在程序中执行SQL了。
直接在项目中内嵌mdf文件的方式使用SQLServer数据库(基于服务的数据库)。mdf文件随着项目走,用起来方便,和在数据库服务器上创建数据没有什么区别,运行的时候会自动附加(Attach)。
双击mdf文件会在“服务器资源管理器”中打开,管理方式和在Mangement Studio没有什么本质区别,要拷贝mdf文件需要关闭所有指向mdf文件的连接。
正式生产运行时附加到SQLServer上,修改连接字符串即可,除此之外没有什么区别,它在“数据库”节点上点右键“附加”;在数据库节点上找任务下的分离可以得到可以拷来拷去mdf文件。
用的时候要在控制台、WinForm项目中在Main函数最开始的位置加入备注中的代码。ASP.Net不需要。备注中的代码如下:
string dataDir=AppDomain.CurrentDomain.BaseDirectory;
if(dataDir.EndsWith(@"\bin\Debug\")||dataDir.EndsWith(@"\bin\Release\"))
{
dataDir=System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
AppDomain.CurrentDomain.SetData("DataDirectory",dataDir);
}
2、连接SQLServer
连接字符串:程序通过连接字符串指定要连哪台服务器上的、哪个实例的哪个数据、用什么用户名密码等。
项目内嵌mdf文件形式的连接字符串"Data Source=.\SQLEXERPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True". ".\SQLEXERPRESS"表示本机上的SQLEXERPRESS实例",如果数据库实例名不是SQLEXERPRESS,则需要修改。“Database1.mdf”为mdf的文件名。
ADO.Net中通过sqlConnection类创建到SQLServer的连接,sqlConnection代表一个数据库连接,ADO.Net中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理执行备注中的代码如果成功了就ok。
3、执行简单的Insert语句
sqlCommand表示向服务器提交的一个命令(SQL语句等)
CommandText属性为要执行的SQL语句,ExecuteNonQuery方法执行一个非查询语句(Update、Insert、Delete等)
using(SqlCommand cmd=conn.CreateCommand())
{
cmd.CommandText="insert into T_Users(UserName,Password) values('admin','888888');
cmd.ExecuteNonQuery();
}
ExecuteNonQuery返回值是执行的影响行数
易错点:string username='test';
.......
cmd.CommandText="insert into T_Users(UserName,Password) values(username,'888888');
4、执行查询
执行有多行结果集的用ExeccuteReader
SqlDataReader reader=cmd.ExecuteReader();
.................
while(reader.Read())
{
Console.WriteLine(reader.GetString(1));
}
reader的GetString、GetInt32等方法只接受整数参数, 也就是序号,用GetOrdinal方法根据列名动态得到序号。
5、ExecuteScalar
sqlCommand的ExecuteScalar方法用于执行查询,并返回查询所返回的结果集中在第一行的第一列,因为不能确定返回值的类型,所以返回值是object类型。
cmd.CommandText="select count(*) from T_Users"; int i=Convert.ToInt32(cmd.ExecuteScalar());
cmd.CommandText="select getdate()";DateTime dt=Convert.ToDateTime(cmd.ExecuteScalar());
得到自动增长字段的主键值,在values关键词前加上output inserted.id,其中id为主键字段名。执行结果就是插入的主键值,用ExecuteScalar执行最方便。
cmd.CommandText="insert into T_Users(UserName,Password)output inserted.id values('admin','888888');
int i=Convert.ToInt32(cmd.ExecuteScalar());
6、SQL注入漏洞攻击
构造恶意的Password:'or'1'='1
if(reader.Read())
{
Console.WriteLine("登录成功");
}
else
{
Console.WriteLine("登录失败");
}
防范注入漏洞攻击的方法:不使用SQL语句拼接,通过参数赋值
总结:后面的练习题基本就是用的是前面的知识点,重点掌握前面的知识点。
通过今天的视频学习,感觉后面的习题有点小难度,要解决它,多看多练。