一.ADO.Net基础
ADO.NET的名称起源于ADO(ActiveX Data Objects),这是一个广泛的类组,用于在以往的Microsoft技术中访问数据。
程序要和数据库进行交互要通过ADO.Net进行,通过ADO.Net就能执行SQL了。ADO.Net中提供了对各种不同数据库的统一操作接口。
用的时候要在控制台、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);
}
备注:这段代码要加在控制台和WinForm项目中,而不加在ASP.Net中的原因如下:在项目中用程序中嵌入mdf文件的方法来进行SQL Server数据库开发,在ASP.Net程序中只需将mdf文件放到项目的App_Data文件即可(DataDirectory的值是当前项目的App_Data路径);而在WinForm中的DataDirectory值则是当前项目的路径,因此WinForm中mdf文件放到项目根目录下即可,但是WinForm程序运行时连接的bin\Debug下的mdf文件,而不是项目中的mdf,也就是有两个mdf文件存在,在程序中加入以上代码可以让程序去连接项目中的mdf文件,而不是bin\Debug下那个文件。
原理分析:连接字符串中的DataDirectory的值就是通过AppDomain.CurrentDomain.SetData赋值过去的,如果当前程序的目录以”\bin\Debug\”或者”\bin\Release\”结尾,则认为它是运行在Visual Studio环境中的,就取项目的目录然后赋值给DataDirectory的这个Key。
二.定义连接SQL Server
不同的数据库俩接字符串的格式不同,一般都包括要俩接的数据库提供登陆名称、登录信息以及要是用的数据库名称。
注意:在定义连接字符串之前,一定要引入相应的命名空间(using System.Data.SqlClient)。
SQL Server是目前与.NET开发程序配合使用最广的数据库,它扮演着很重要的角色!在.NET Framework中,称处理数据源(库)的应用程序为托管提供程序,并且专门为SQL Server数据库提供了一个托管提供程序,即SQL Server托管提供程序,它用来连接和处理SQL Server数据库。连接SQL Server数据库的连接字符串是以“键/值”对的形式的语句组合而成的。其中常用的属性及其说明如下:
1、 Data Source:数据源。计算机名称或者IP地址。
2、Server:服务器。数据库所在计算机的名称。
3、 Database:数据库名称。
4、 Initail Catalog:数据库的名称。
5、 User ID:用于连接数据库的用户名称。
6、 Password:用于连接数据库的用户密码。
7、 Pooling:标志是否使用数据库连接池。
8、 Intergrated Security:系统集成安全验证。标志登录数据库时是否使用系统集成验证。
9、 Connection Timeout:连接超时的时间。系统再次尝试连接数据库时所经历的时间,单位为秒,默认值为15秒。
连接字符串:程序通过连接字符串指定要连哪台服务器上的、哪个实例的哪个数据库、用什么用户名密码等。项目内嵌mdf文件形式的连接字符串“Data Source=.\SQLEXPERSS;AttachDBFiliename=|DataDirectory|\Database1.mdf;Integrated Security=Ture;User Instance=True”.“.\SQLEXPRESS”表示“本机上的SQLEXPRESS实例”,如果数据库实例名不是SQLEXPRESS,则需要修改(一台服务器上可以安装不同实例的数据库)。“Database1.mdf”为mdf的文件名。Integrated Security=Ture或者Integrted Security=SSPI就是使用信任链接,即数据库登陆里的windows身份验证模式,这种模式下不需要用户名和密码(SSPI是Security Support Provider interface(Microsoft安全支持提供器接口)的缩写)。
在调试过程中可能出现的错误:
A. “由于启动用户实例的进程出错,导致无法连接SQL Sever的用户实例,该连接将关闭”解决方案:删除C:\Documents and Settings\[USERNAME]\local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS目录即可。
B. “版本太低,只支持SQL 2005及以下数据库”:安装VS 2005SP1(补丁)即可。
三.SQL注入的攻击
以下为一个控制台的小的登陆程序代码:(只取其中的一部分代码):
cmd.CommandText=”select count(*) from T_Users where username=’”+username+”’ and password=’”+password+”’ ”;
int i=Convert.ToInt32(cmd.ExcuteScalar());
if(i>0)
{//登陆成功}
else
{//登录失败}
现在我在控制台上输入用户名为:1’ or ‘1’=’1(输入的用户名和数据库中的不一致),密码为:888888(输入的密码和数据中的一致)。奇迹出现了:我竟然也能登陆成功!!这就是所谓的SQL注入的攻击,因为采用的是字符串拼接的方式,所以当我向控制输入以上内容时,where后边的字符串为: where name=’1’ or ‘1’='1’ and password =’888888’ (注意:在where 中,or 和and 如果同时出现在语句中时,应该先执行与and有关的,其结果在和or进行判断),经过测试得知,where后边的判断结果为真,所以我能都登陆成功!结论:只要输入的字符串能是where后面的字符串为真就可以登陆成功!!
为了解决这个问题,我们要用参数化查询的方式:(附上代码)
cmd.CommandText=” select count(*) from where username=@username and password=@password”;
cmd.Parmeters.Add(new sqlParmeter(“username”, txtUsername.Text));
cmd.Parmeters.Add(new sqlParmeter(“password”, txtPassword.Text));