一、ADO.NET连接SQLServer
ADO.NET基础:
程序员要和数据库交互要通过ADO.NET进行,通过ADO.NET就能在程序中执行SQL了,ADO.NET中提供了各种不同数据库的统一操作接口
直接在项目中内嵌mdf文件的方式使用SQL(基于服务的数据库)。Mdf文件随项目走用起来方便,和在数据库服务器上的创建数据库没有什么区别,运行时会自动附加(Attach)。
双击mdf文件会在“服务器资源管理器中打开,管理方式和在Mangement Studio没有什么本质不同。要拷贝mdf文件需要关闭指向mdf文件的连接
正式生产运行的时候附加到SQLServer上、修改连接字符串即可,除此之外没有任何区别,在数据库“节点上点击右键“附加”;在数据库节点上->任务->分离就可以得到可以拷来拷去的mdf文件了
用的时候要在控制台=、winform项目中的Main函数最开始位置加入备连中的代码ASP.net项目中不需要
连接SQLServer:
连接字符串:程序通过连接字符串指定要连接哪台服务器上的、那个实例的哪个数据库、用什么用户名密码的等
项目内嵌mdf文件形式的连接字符串:
DataSource=.\SQLEXPRESS;//实例名
AttachDBFilename=|DataDirectory|Database1.mdf;//要附加的mdf
IntergratedSecurity=True;
Userinstance=true;
ADO.NET中通过SqlConnction类创建到SQLServer的连接,SqlConnction代表一个数据库连接:SqlConnection conn = new SqlConnection(@"DataSource=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|Database1.mdf;
IntegratedSecurity=True;User instance=true;");
conn.Open();
Console.WriteLine("打开数据库连接成功|");
ADO.NET中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理
由于启动用户实例的进程时出错,导无法生成SQServer实例
二、ADO.NET详解
在实现了Dispose接口的在使用完之后要使用using将资源释放
Using(SqlConnection conn =newSqlConnection(@"DataSource=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|Database1.mdf;
IntegratedSecurity=True;User instance=true;"))
{ conn.Open();}//using管的范围到}这里
Console.WriteLine("打开数据库连接成功|");
执行简单的insert语句:
SqlCommand表示向服务器提交的一个命令(SQL语句等)
CommandText属性为要执行的SQL语句,ExcuteNonQuery方法执行一个非查询语句(update、insert、delete等):
using (SqlConnectionconn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|Database1.mdf;
IntegratedSecurity=True;User instance=true;"))
{
conn.Open();
using (SqlCommand cmd=conn.CreateCommand ())
{
cmd.CommandText ="insert into MyTable1(Name) values ('abc')";CommandText属性为要执行的SQL语句
cmd.ExecuteNonQuery();//执行一个非查询语句
Console.WriteLine("插入成功");
}
}
ExecuteNonQuery()返回值是执行影响的行数
执行查询:
执行多行结果集用ExecuteReader
/*
Console.WriteLine("请输入用户名:");
string username =Console.ReadLine();
Console.WriteLine("请输入密码:");
string password =Console.ReadLine();
using (SqlConnection conn = newSqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|Database1.mdf;
IntegratedSecurity=True;User instance=true;"))
{
conn.Open();
using (SqlCommand cmd =conn.CreateCommand())
{
cmd.CommandText ="select *from T_Users where UserName='" + username + "'" // cmd.CommandText =string.format("insert into T_Users1(UserName,Password)values('{0}','{1}');",username,password);
//先到表中查用户输入的用户名对应的信息
using (SqlDataReader reader= cmd.ExecuteReader())
{
if (reader.Read())
{
//用户名存在
//Console.WriteLine("请输入密码:");
//string password =Console.ReadLine();
string dbpassword =reader.GetString(reader.GetOrdinal("password"));//数据库中的密码
if (password==dbpassword )//比较数据库中的密码和用户输入的密码是否一致
{
Console.WriteLine("登陆成功");
}
else//Read返回false,就是没有查找到这个用户
{
Console.WriteLine("密码错误登陆失败");
}
}
else
{
Console.WriteLine("用户名错误");
}
}
}
}*/
User在SQL中是关键字,加[ ]可消除,表名一般以T_开头,字段一般以F_开头
ExcuteScalar:
SqlCommand的ExecuteScalar方法用于执行查询,并且返回查询所返回的结果集中第一行的第一列,因为不能确定返回值类型所以返回值是object类型
using (SqlConnection conn = new SqlConnection(@"DataSource=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|Database1.mdf;
IntegratedSecurity=True;User instance=true;"))
{
conn.Open();
using (SqlCommand cmd =conn.CreateCommand())
{
cmd.CommandText ="select count(*) from T_Users1";
Console.WriteLine(cmd.ExecuteScalar());//返回第一行的 第一列的数据
}
}
得到自动增长字段的主键值,在values关键词 前加output ,
using (SqlConnection conn = new SqlConnection(@"DataSource=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|Database1.mdf;
IntegratedSecurity=True;User instance=true;"))
{
conn.Open();
using (SqlCommand cmd =conn.CreateCommand())
{
cmd.CommandText="Insert into T_Users1(UserName,Password) Output inserted.IdValues('admin','888888')";
//得到新增字段的值
int id=Convert.ToInt32(cmd.ExecuteScalar());
Console.WriteLine("新增的主键:{0}",id);
}
}
返回多行多列时用:ExecuteReader();
using (SqlConnection conn = new SqlConnection(@"DataSource=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|Database1.mdf;
IntegratedSecurity=True;User instance=true;"))
{
conn.Open();
using (SqlCommand cmd =conn.CreateCommand())
{
cmd.CommandText ="select *from T_Users1";
using (SqlDataReaderreader=cmd.ExecuteReader())
{
while (reader.Read ())
{
//Console.WriteLine(reader.GetString(1));//将当前行的第一列打印出来
//Console.WriteLine(reader.GetString (reader.GetOrdinal ("UserName")));
// reader.GetOrdinal("UserName");ADO中用GetOrdinal()方法动态获取列数
//显示多行多列
stringusername=reader .GetString (reader .GetOrdinal ("UserName"));
int id=reader.GetInt32(reader.GetOrdinal("Id"));
string password =reader.GetString(reader.GetOrdinal("Password"));
Console.WriteLine("Id={0},UserName={1},Password={2}",id,username,password );
}
}
}
}
Close:关闭以后还能打开
Dispose:直接销毁,不能在使用
Using:在出了作用域之后调用disposeSqlConnection、FileStream等的Dispose内部都会做这样 的判断:判断有没有close,如果没有close就先close再dispose。用using内部会自动close
SQL注入漏洞攻击:
Console.WriteLine("请输入用户名:");
stringusername = Console.ReadLine();
Console.WriteLine("请输入密码:");
stringpassword = Console.ReadLine();
using(SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|Database1.mdf;
IntegratedSecurity=True;User instance=true;"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select count(*) from T_Users1 where UserName=@UNand Passwor=@p";//不要用字符串拼接,当password输入’or‘1’=‘1时,会造成数据漏洞
cmd.Parameters.Add(new SqlParameter("UN", username));
cmd.Parameters.Add(new SqlParameter("P",password ));
int i = Convert.ToInt32(cmd.ExecuteScalar());
if (i>0)
{
Console.WriteLine("登陆成功");
}
else
{
Console.WriteLine("用户名或密码错误!");
}
}
}
防止注入漏洞攻击的方法:不适用SQL语句拼接,通过参数赋值
三、读取配置中的连接字符串
ComBox的显示值:Items.Add的参数时Object类型,可以设置DisplayMember属性设定显示的属性,通过SelectItem属性取得到就是选择的条目对应的对象。例如:取出的是Object,怎么转换成对应的类型?变量名只是“标签”。显示的值和实际的对象不一样,在asp中也有相同的东西
创建一个ProvinceItem类,将数据填充在这个对象中添加到ComBox中
将连接字符串写在代码中的缺点:多次重复,违反了DRY(Don’t Repeat Yourself)原则;如果要修改连接字符串就要修改代码。将连接字符串写在APP.Config中:
添加App.config文件:添加 新建项 常规应用程序配置文件。App.Config是.net的通用配置文件,在asp中也同样适用、
在App.Config中添加connectionString段,添加一个add项,用name属性起一个名字比如DBConnstr connectionString属性指定连接字符串
在“引用”节点上点击右键“添加引用”,找到System.configuration。不是所有.net中的类都能直接调用,类所在的Assembly要被添加到项目中才可以
ConfigurationManager.ConnectionString[“DBConnStr”].ConnectionString得到连接字符串
如何在部署的程序中修改配置:打开.exe文件目录下的config文件就可以了
---------------------- Windows Phone 7手机开发、 .Net培训、期待与您交流! ---------------------- 详细请查看: http://edu.csdn.net/heima/