黑马程序员—学习笔记之ADO.Net

时间:2022-12-26 12:17:54
---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------一、ADO.Net

程序和数据库交互需要通过ADO.Net进行,通过ADO.Net能再程序中执行SQL。ADO.Net中提供了对各种不同数据库的统一操作接口。

二、连接SQLServer

ADO.Net通过SqlConnection类实现到SQLServer的连接,ADO.Net中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理

(一)连接字符串

通过连接字符串指定要连哪台服务器上的、哪个实例的哪个数据库、用什么用户名密码等

(二)SqlConnection类

SqlConnection代表一个数据库连接

1.open()方法

打开数据库连接

using(SqlConnection conn = new SqlConnection(Data Source=VVP-PC\JADAM;Initial Catalog=master;Integrated Security=true))
{
conn.open();
}

2.CreatCommand()方法

创建并返回一个与SqlConnection关联的SqlCommand对象

SqlCommand cmd = conn.CreateCommand();

3.close()方法

关闭连接,还可以再打开。像水管的水龙头,关闭之后还可以再打开

4.dispose()方法

释放内存资源,不能再open()。像撤了水管,不能再打开,只能重新建立

a)using是在出了作用域以后调用Dispose方法

b)SqlConnection、FileStream等的Dispose内部都会做这样的判断:判断有没有Close,如果没有就先Close再Dispose

(三)SqlCommend类

表示向服务器提交一个命令(SQL语句等)

1.CommandText属性:为要执行的SQL语句,如

cmd.CommandText = "Insert into MyTables(name) values ("abc")";

2.ExecuteNonQuery()方法:执行一个非查询语句(Update、Insert、Delete等),返回值是受影响的行数

cmd.ExecuteNonQuery();

3.ExecuteScalar()方法

返回执行结果的第一行第一列的结果,返回值类型为object

Convert.ToString(cmd.ExexcutScalar());
4. ExecuteReader()方法

CommandText 发送到Connection 并生成一个SqlDataReader,返回值为SqlDataReader对象

SqlDataReader reader = cmd.ExecuteReader();

INSERT语句中的OUTPUT用法:

INSERT INTO T_User (username,password) OUTPUT INSERTED.Id VAULES ('admin','123456')--输出T_User插入数据中自增字段Id的值

(四)SqlDataReader类

1.GetOrdinal()方法

获取指定列名的列序号,如

reader.GetOrdinal("Password");

2.GetString()方法

获取指定列的字符串形式的值,与GetOrdinal()方法结合使用

string dbpassword = reader.GetString(reader.GetOrdinal());

3.Read()方法

使 SqlDataReader 前进到下一条记录,返回值为bool类型

while(reader.Read()){Console.WriteLine(reader.GetString(reader.GetOrdinal()));}

三、注入漏洞

using (SqlConnection conn = new SqlConnection(@"Data Source=VVP-PC\JADAM;Initial Catalog=master;Integrated Security=true"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT COUNT(*) FROM T_User WHERE username ='" + userName + "' AND password = '" + passWord + "'";
if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
{
Console.WriteLine("登陆成功!"); }
else
{
Console.WriteLine("用户名或密码错误!");
}
}//假如输入用户名admin,密码1 or '1'='1'
}

四、参数化查询

SQL语句(存储过程)使用 @参数名  表示“此处用参数代替”,想SqlCommand的Parameters中添加参数

using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT COUNT(*) FROM T_User WHERE username = @UR and password = @PW";
cmd.Parameters.Add(new SqlParameter("UR", userName));
cmd.Parameters.Add(new SqlParameter("PW", passWord));

if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
{
Console.WriteLine("登陆成功!");
}
else
{
Console.WriteLine("用户名或密码错误!");
}
}//参数化查询

参数在SQLServer内部不是简单的字符串替换,SQLServer直接用添加的值进行数据比较,因此不会有注入漏洞攻击

附:简单的思维导图

黑马程序员—学习笔记之ADO.Net

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ---------------------- 详细请查看: http://net.itheima.com/