SQL Server之 ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server之 ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号相关的知识,希望对你有一定的参考价值。
SQL Server之 (四) ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号
自己学习笔记,转载请注明出处,谢谢!---酸菜
1.什么是ADO.NET
ADO.NET是一组类库,这组类库可以让我们通过程序的方式访问数据库,并以各种方式操作存储在其中的数据;
ADO.NET是基于.NET FrameWork,与.NET FrameWork类库的其余部分是高度集成的
2.连接数据库的步骤
①创建连接字符串
Data Source=XXX-PC; Initial Catalog=MyDataBase; Integrated Security=True;
连接服务器实例 连接数据库 是否Windows验证登录
Data Source=localhost/192.168.1.1; Initial Catalog=MyDataBase; User ID=sa; Password=123;
连接服务器实例 连接数据库 数据库账户密码验证登录
server=.;database=MyDataBase;uid=sa;pwd=123;----以前的老式写法,现在也在用;
string conn="Data Source=XXX-PC; Initial Catalog=MyDataBase; Integrated Security=True";
②创建连接对象,并把连接字符串传进来;
SqlConnection sqlCon=new SqlConnection(conn); //SqlConnection 是SQL Server的类,其他数据库有对应的类;
③打开连接,测试连接/关闭连接,释放资源;
sqlCon.Open();
sqlCon.Close();
sqlCon.Dispose();
如果在连接时使用using 如:
using (SqlConnection sqlCon=new SqlConnection(conn))
{
sqlCon.Open();
//如果使用using 就不用sqlCon.Close();和sqlCon.Dispose();因为using内部已经写好了Dispose,而SQLConnection中的Dispose中写好了Close,所以两者都不用再写;
}
④创建一个可以执行Sql语句的命令对象
string sql="insert into Users values()";
using(SqlCommand cmd=new SqlCommand()/(sql,sqlCon))
{
//因为SQLCommand对象也需要释放,所以此处用了using.
//如果使用无参的的构造函数,可 cmd.CommandText=sql; cmd.Connection=sqlCon;
}
⑤执行语句
无论执行什么SQL语句,调用以下三个方法都可以执行出来结果,但是通常有使用习惯:
<1> cmd.ExecuteNonQuery();//执行 insert /delete/update 语句时使用;
这个方法返回值是int类型,表示执行insert/delete/update 语句后影响的行数
注意:ExecuteNonQuery()只有执行 insert/delete/update语句时会返回影响行数,执行其他的SQL语句时,永远返回的是-1;
<2>cmd.ExecuteScalar(); //查询单行单列结果集时 使用;
这个方法返回值是object类型,当查询语句是使用聚合函数,那么该方法返回不可能是null值,因为聚合函数返回没有null值;如果不是聚合函数可能返回null值,所以使用返回值之前先判断是否为null;
<3>cmd.ExecuteReader();//查询多行多列结果集时使用;
这个方法返回值是SqlDataReader类型,通过该方法将给定的SQL语句在数据库中执行,但是没有返回给程序,只给程序返回一个reader对象,就是用这个对象来获取数据的.
using (SqlDataReader reader=cmd.ExecuteReader())
{
//需要用reader对象一条一条获取数据
//在获取数据之前,先判断一下本次查询是否查到数据;
if(reader.HasRows)//如果有数据返回true,否则false
{
//有数据,需要用reader一条一条获取
//每次获取数据前,都先调用reader.Read()方法,向后移动一条数据,如果成功移动到一条数据上, 返回true;否则false
while(reader.Read())
{
//获取当前reader指向的数据
//reader.FieldCount 可以查出当前语句查询出来的列数;
for (int i =0;i<reader.fieldcount;i++)
{
Console.WriteLine(reader[i]);
//reader[i];reader.GetValue(i); reader[""]列名称;
//当遇到数据为null值,通过reader.GetValue()或reader[]索引器获取列值,返回的是DBNull.Value 不是C#中的null值,而DBNull.Value.ToString()后是空字符串,所以并不报错;
}
}
}
else
{
Console.WriteLine("没有查到任何数据!");
}
}
<4>DataReader的特点:
只读,只进.只能通过reader读取数据,不能修改.reader只能一条一条向前移动,不能向后,也不能跳跃;
使用reader时必须保证连接是否打开状态.当reader使用完毕后, 必须把reader关闭,释放.同时释放连接对象;
默认情况下, reader独占一个连接对象;
3.获取插入数据的自增列
① insert into Table output inserted.ID(自增列或者要取值的列) values(‘Hello‘,‘英语课‘);
②insert into Table values(‘Hello‘,‘语文课‘) select @@identity; 这个相对上面那个 因为@@identity是全局变量 所以可能会出错,取到别人执行的最新的自增列;
4.防SQL注入
①SQL注入:使用SQL拼接的方式不安全,会出现SQL注入的问题;解决方法:使用带参数的SQL语句或者使用存储过程.(带参数的SQL 在SQL执行过程中内部会转为存储过程执行)
②使用带参数的SQL语句;如果SQL语句中有参数(以@符号开头),那么必须给Command对象提供参数和参数的值;
using (SqlCommand cmd=new SqlCommand(sql,con))
{
SqlParameter paramUserID=new SqlParameter("@UserID",SqlDbType.varchar,50){Value=txtUserId.Text.Trim()}; //使用对象初始化器
SqlParameter parampwd=new SqlParameter("@pwd",SqlDbType.varchar,50){Value=txtpwd.Text.Trim()}; //使用对象初始化器
cmd.Parameters.Add(paramUserID);
cmd.Parameters.Add(parampwd);
con.Open();
int t=(int) cmd.ExecuteScalar();
if(t>0){}
}
推荐简化版:
SqlParamerter [] params=new SqlParameter[]{
new SqlParameter ("@UserID",SqlDbType.Varchar,50){Value=txtUserID.Text}),
new SqlParameter("@pwd",SqlDbType.Varchar,50){Value=txtpwd.Text}) }
cmd.Parameters.AddRange(params);
另一种不推荐方法:
cmd.Parameters.AddWithValue("@UserID",txtUserId.Text);
cmd.Parameters.AddWithValue("@pwd",txtpwd.Text);
注:所有对数据库引擎的操作在这里都可以监视到 工具→SQL Server Profiler(SQL Server事件探查器)→连接→运行.
以上是关于SQL Server之 ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)