---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
dotnet 连接sqlserver ado.net技术
连接字符串:指定连接到那台服务器上,那个实力的那个数据库,用户名及其密码是
项目中内嵌mdf 文件,连接字符串"Data
Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|Database1.mdf;Integrat
ed Security=true;User Instance=true"
ado.net中通过SqlConnection 类 创建sqlserver的连接
每一个Sqlconnection的一个实例就代表了一个数据库的连接
string connectionstring="Data
Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|Database1.mdf;Integrat
ed Security=true;User Instance=true"
SqlConnection con=new SqlConnection(connectionstring);
con.open();
注意:!! 由于ado.net中的连接资源都是实现了IDisposeable接口的 所以使用完这
个对象之后必须要关闭这个对象才行, 关闭时候可以使用 connection,command
1.using(SqlConnection con=new SqlConnection(connectionstring);)
{
con.open();//离开了这个{}之后就会自动释放这个资源也就是说调用看dispose()
using在出了作用域以后就调用dispose(),像SqlConnection,filestream等的
dispose()内部都会做这样的判断:先判断有没有close,如果没有close,就先close
在dispose
}//使用这个比较简单实用
2.
try
{
con.open()
}
finaly
{
con.colse();
con.Dispose()//表示 释放这个对象拥有的资源
}
先close() 在 dispose()
面试热点:close()只是关闭了这个连接,但是还能打开 //水管关上了 还能打开
dispose()表示损毁了这个连接资源已经回收了 不能在打开 //把水管给撤了,没有
这个水管了 ,
sqlcommand 语句//执行非查询语句
sqlcommand 表示像数据库提交的一个命令 即sql语句
.using(SqlConnection con=new SqlConnection(connectionstring);)
{
con.open();//离开了这个{}之后就会自动释放这个资源
using (SqlCommand cmd=new CreateCommand())
{
insertstring="insert into students (id,name,score) values(1,'liu',90)";
cmd.ComandText=insertstring;//commandtext属性表示要执行的sql语句
cmd.ExecuteNoQuery();//Query表示 "查询"的意思 在这里是插入语句不是查询 所
以用 ExecuteNoQuery() “执行这个不是查询的语句" (update insert delete)执
行完后返回的是一个int类型的数 表示影响数据库中的行数
}
}
**executescalar//执行返回一行一列的语句
sqlcommand的executescalar()方法用于执行查询,并返回查询所返回的结果集中第
一行的第一列 因为不能确定返回值的类型,所以返回值是objec类型(int
datatime,atring 等)
!!!一般用于 查询表中总数据条数 , 最大值等 ,还有在aql中解决用户并发注册问
题是提出的newid()和自动增长字段,时候返回 id列值的问题【output inserted.id
】,这样单返回行的!!!
cmd.commandtext="select count(*) from users";
console.writeline(cmd.executescalar());//返回第一行第一列 ,即表中总行数
cmd.commandtext="select * from users";
console.writeline(cmd.executescalar());//这样写一般没什么意思 返回了id的第
一个数
cmd.commandtext="insert into users output inserted.id values('hhe',23)";
int id=convert.toint32(cmd.executescalar());
console.writeline("新插入列的主键值是:{0}",id)
**executereader//执行多行多列数据
cmd.commandtext="select* from users";
using(sqldatereader reader=cmd.executereader())
{
while(reader.read())//返回值是一个bool类型的 只要调用一下他 就会自动向后挪
一行(当然在执行它之前已经在内存中建好了一个地址列表,里面存放了要查询表中
的所有数据),当读到最后一条数据后在调用就会返回false
{
console.writeline(reader.getstring(reader.getorigenal(1)));//
}//getstring (序号n) 表示读取了当前这一行的第n列的值
}//getoridinal(列名) 根据方法中的列名动态得到该列所在这一条数据中的序号,
这个序号从0开始
读出来这个表中所以数据
using (sqldatereader reader=cmd.executereader())
{
while(reader.read())//只能一行一行的往前读 不能往回走也不能跳读
{
int id=convert.toint32(reader.getstring(reader.getoridinal("id")));
string name=reader.getstring(reader.getoridinal("name"));
int id=convert.toint32(reader.getstring(reader.getoridinal("age")));
console.writeline("id={0},username={1},age={2}",id,name,age);
}
}
参数化查询
sql语句使用@un表示"此处用参数代替“,像sqlcommand的parameter中添加参数
参数在sql server内部不是简单的字符串替换 而是进行数据比较 所以不会有注入漏
洞
parameters //防止sql注入式漏洞方法 ,不要像上面的形式一样去拼字符串使用cmd
中的参数去传值 先用这种类似于占位符的形式
using(sqlcommand cmd=conn.executecommand())
{
cmd.commandtext="select count(* )from users where username=@un and
password=@pw";
cmd.parameters.add(new sqlparameter("un",name));
cmd.parameters.add(new sqlparameter("pw",password));//会拿着用户输入的字符
串去和数据库表中数据去核对
int count=convert.toint32(cmd.executescalar());
if(count>0)
{console.writeline("登录成功");}
else
{console("失败");}
}
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------详细请查看:http://net.itheima.com/