程序和数据库交互需要通过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直接用添加的值进行数据比较,因此不会有注入漏洞攻击
附:简单的思维导图
---------------------- Windows Phone 7手机开发、 .Net培训、期待与您交流! ---------------------- 详细请查看: http://net.itheima.com/