4月16日
一、ADO.Net基础
程序要和数据库交互要通过ADO.Net进行,通过ADO.Net就能在程序中执行SQL了。
直接在项目中内嵌mdf文件的方式使用SQLServer数据库。
1、新建mdf文件:
(1)解决方案资源管理器->第一个mdf(项目)右键->添加->新建项->数据->基于服务的数据库
(2)双击mdf文件,在左边服务器资源管理器中列出其包含的文件,可以在其中创建表。
2、拷贝mdf文件:
(1)关闭连接:服务器资源管理器->Datebase.mdf右键->关闭连接
(2)打包:解决方案“第一个mdf”右键->在windows资源管理器中打开文件夹->将文件夹和sln文件一起打包
3、将mdf文件附加到SQLServer上:
打开Microsoft SQL Server Management Stdio->数据库(右键)->附加->添加->将mdf文件的路径拷到“文件名”中(例:G:\资料\VisualStudio 2008\Projects\第一个mdf\第一个mdf\Database1.mdf)
不用的时候,右键->任务->分离
二、连接SQLServer
连接字符串:程序通过连接字符串指定要连到哪台服务器上的哪个实例的哪个数据库,用什么用户名密码等。具体代码如下:
static void Main(string[] args)
{
//写程序前必加,具体意思再讲
stringdataDir = 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);
}
//连接字符串,注意DataDirectory要加“| |”
SqlConnectionconn =newSqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;IntegratedSecurity=True;User Instance=True");
conn.Open();
Console.WriteLine("打开数据库连接成功");
Console.ReadKey();
}
ADO.Net通过SqlConnection类创建到SQLServer的连接,SqlConnection代表一个数据库连接,ADO.Net中的连接等资源都实现了IDispoable接口,可以使用using进行资源管理,确定其使用范围。具体方法如下:
using (SqlConnection conn =newSqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;IntegratedSecurity=True;User Instance=True"))
{
conn.Open();
}
在写连接字符串的时候DataDirectory没加“| |”,致使程序不能正常运行,求助了好久才被细心的柏云衫同学发现。可见编程是个细活,马虎不得。
DataDirectory:解析为映射和元数据文件的相对路径。这是通过AppDomain.SetData("DataDirectory", objValue)方法设置的值。DataDirectory替代字符串必须由竖线字符括起来,并且在其名称与竖线字符之间不能存在任何空格。
三、函数、方法
1、ExecuteScalar():返回第一行第一列的数据
2、ExecuteReader():执行有多行结果集的
3、Close():关闭后还能打开
4、Dispose():直接销毁,不能再次使用
四、注入漏洞与参数化查询
//登录程序 演示臭名昭著的SQL注入漏洞攻击
Console.WriteLine("请输入用户名:");
stringusername = Console.ReadLine();
Console.WriteLine("请输入密码:");
stringpassword = Console.ReadLine(); //注入漏洞 输入:1' or '1'='1
using(SqlConnection conn =newSqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;IntegratedSecurity=True;User Instance=True"))
{
conn.Open();
using (SqlCommandcmd = conn.CreateCommand())
{
cmd.CommandText= "select count(*) from T_Users whereUserName='" + username + "' andPassword='" + password + "'";//注入漏洞后 select count(*) from T_Users whereUserName='admin' and Password='1' or '1'='1'(永远成立)
int i = Convert.ToInt32(cmd.ExecuteScalar());
if (i > 0)
{
Console.WriteLine("登录成功!");
}
else
{
Console.WriteLine("用户名或密码错误!");
}
}
}
//参数化查询,避免注入漏洞
Console.WriteLine("请输入用户名:");
stringusername = Console.ReadLine();
Console.WriteLine("请输入密码:");
stringpassword = Console.ReadLine(); //注入漏洞 输入:1' or '1'='1
using(SqlConnection conn =newSqlConnection(@"DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;IntegratedSecurity=True;User Instance=True"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText= "select count(*) from T_Users whereUserName=@UN and Passwprd=@P";//参数化查询,避免注入漏洞
cmd.Parameters.Add(newSqlParameter("UN",username));
cmd.Parameters.Add(newSqlParameter("P",password));
int i = Convert.ToInt32(cmd.ExecuteScalar());
if (i > 0)
{
Console.WriteLine("登录成功!");
}
else
{
Console.WriteLine("用户名或密码错误!");
}
}
}
ADO.Net比WinForm和SQL更难,一天看来是入不了门了,明天继续……
小常识:
今天不小心把窗口拖乱了,找到一个方法重置开发环境:工具->导入导出
---------------------- Windows Phone 7手机开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://net.itheima.com/