学习笔记(二)——数据库命令对象的应用
1. 创建Command对象都通过类似于下面的语句来实现:
xxxConnection conn = new xxxConnection("myString");
xxxCommand myCmd = new xxxCommand("select * from orders",conn);
2.设置连接和SQL相关命令
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString = "Server=(local);Database=xxx;Integrated Security=sspi"; //默认用Windows验证
sqlConnection.Open();
sqlConnection.Close();
3.ADO.net 中的主要类:
Connection 负责连接到数据 负责找到数据,进行身份证验证,与数据建立起一个传数据的通道
Command 负责操作纵数据库 向数据发送 sql 让数据执行;
DataReader 负责快速只进的读取数据 一行一行的读取数据;
举例:如果访问 sqlserver 数据库,SqlConnection SqlCommand…..
连接数据库的对象: 连接到数据的步骤
SqlConnection:
第一步: SqlConnection conn = new SqlConnection(连接字符串);
第二步: 调用 Open() 连接到数据库
第三步: 调用 conn.Close();断开与数据库的连接
操作数据库:
第一步: SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Connection属性:设置连接对象
cmd.CommandText属性:要执行的 sql语句
例如:
//SqlCommand cmd = new SqlCommand();
//cmd.Connection = conn; //设置连接对象,这样command
就知道要操作哪一个数据库了
//cmd.CommandText = string.Format("insert into class
values('{0}','{1}')",
// textBox1.Text, textBox2.Text);
第二步:int i = cmd.ExecuteNonQuery();//用于执行一个没有返回值(insert
update delete)的sql语句,
//这个方法的返回值是受影响的行数
第 一 个 重 要 方法:cmd.ExecuteNonQuery()
上面的方法,无法得到数据库中的值,要想得到数据库中的值怎么办?
第二个重要方法 的方法:
ExecuteScalar 执行一个 sql语句(一般是 select语句)并且返回第一行第
一列的值,由于没有办法确定第一行第一列的数据类型,所以他的返回值类型
为: object
4.执行命令
建立了数据源的连接和设置了命令之后,Command对象执行SQL命令有三种方法:ExecuteNonQuery、ExecuteReader和ExecuteScalar。
ExecuteNonQuery:不会返回结果集,只会返回语句影响的记录行数,它适合执行插入、更新、删除之类不返回结果集的命令
ExecuteReader:使用ExecuteReader方法执行的命令,可以返回一个类型化的DataReader实例或者IDataReader接口的结果集。
ExecuteScalar:调用SQL命令的方法ExecuteScalar来执行命令,并接受单个结果(即标量)
5.数据库访问公共类 DBHelper.cs
把连接字符串写到配置文件中:
第一步:创建一个应用程序配置文件 (app.config 项目中叫,生成后叫 应用程序名.config)
第二步:
第三步:在应用程序中读取连接字符串
右击解决方案中的”引用:->添加引用
static string connString =
System.Configuration.ConfigurationManager.ConnectionStrings["ConnStri
ng"].ConnectionString;
6.数据库加密(哈希算法)
插入数据values( “3050507001”,HASHBYTES (‘MD5’, ‘7001’)
访问数据库获取账号密码:
sqlCommand.CommandText = "SELECT COUNT(1) FROM tb_User"
+ " WHERE No='" + this.txb_UserNo.Text.Trim() + "'" //将文本框的文本清除首尾的空格后,拼接至命令文本中;
+ " AND Password=HASHBYTES('MD5','" + this.txb_Password.Text.Trim() + "');";
容易产生注入式攻击(’)or 1=1;--)出现错误
解决办法(参数):
sqlCommand.CommandText =
"INSERT tb_User (No,Password) VALUES(@No,HASHBYTES('MD5',@Password));"; //指定SQL命令的命令文本;命令文本包含参数;
sqlCommand.Parameters.AddWithValue("@No", this.txb_UserNo.Text.Trim()); //向SQL命令的参数集合添加参数的名称、值;
sqlCommand.Parameters.AddWithValue("@Password", this.txb_Password.Text.Trim());
sqlCommand.Parameters["@Password"].SqlDbType = SqlDbType.VarChar; //将密码参数的类型设为变长字符串;
7.异常错误
错误提示:
解决办法:
try {
sqlConnection.Open();
rowAffected = sqlCommand.ExecuteNonQuery(); //调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;
}
catch (SqlException sqlEx) //捕捉SQL异常;
{
if (sqlEx.Number == 2627) //若SQL异常编号为2627,则违反主键/唯一约束,即插入重复值;
{
message = "您注册的用户号已存在,请重新输入!"; //给出合适的错误提示;
}
else
{
message = "注册失败!"; //给出一般错误提示;
}
}
finally {
sqlConnection.Close();
}
if (rowAffected == 1) //若成功写入1行记录;
{
message = "注册成功。"; //给出正确提示;
}
MessageBox.Show(message);
}
}