经验:
- 控件 From : frm名称 frmLogin
- 如何在按钮中添加快捷键 登录(D) 这个是这么做的呢? 其实很简单 就是把按钮的 Text属性 改成 登录 (&D)
-
如果忘记了Sql数据库的connectionStrings ,
- 可以创建一个 文本文件, 后缀改为 udl
- 开始设置具体连接方法,
- 用在记事本中打开 , 就可以看到连接数据库的 connectionStrings
-
SqlDataReader 的对象记得要Close() , 不然就会占用这个资源 , 虽然出了 using 的 { } 的时候会释放,但是 释放和关闭时不一样的.
- 释放的意思是封闭了这个桥, 虽然封闭了, 但是在内存中还是占有内存的, 一段时间后才会关闭掉
- 关闭的意思是炸掉了这个桥,
-
字段和属性的区别?
-
属性是类提供给外部调用时用,的可以使用 对象.属性 设置或读取 一个值 get{reture xxx;}表示可读 set{xxx = value;}表示可写 字段就是类内部用的.存储数据
-
-
数据库的安全
- SQL注入攻击: 就是通过对一些的探测SQL中的数据的 SQL语句来进行分析 , 如果C#中 和数据库连接的安全逻辑不够,那个就可以不用用户密码就可以登入...
- eg: select count(*) from 表 where name = ‘ {0} ‘ and psw = ‘{1 }‘ 很多人多用这个来判断用户名和密码是否一致, 所以我们要找一个 {0} 和 {1} 的字符串使得 count(*) = 1 ,这样就可以不用知道账号密码登录. 这里有一个{0}就可以 了, {0} =" ‘ or 1=1 -- " 这个就可以了,那个{1} 还都可以不用考虑, 虽然这里返回的不是 = 1 , 但是是 >0
-
因此,我们要注意以下几点
- 对客户输入进行判断
- count == 1 (王道) 就是我们验证是否有这个账号密码用这个 而不是 count > 0
- 用存储过程开发
- CTRL + J 可以弹出 那个代码补全的部分(很好用) .....
- 判断字符串为空的方法? str.length == 0
-
窗体之间的跳转?在frmLogin这个面板的 登录按钮 的那个登录成功的地方加上这几句this.DialogResult = DialogResult.Yes ;在program.cs 的类中加上FrmLogin login = new FrmLogin();DialogResult dr = login.showDialog() ; //阻塞式代码if (dr == DialogResult.Yes){Application.Run( new FrmMain() ); //这里面的是主要面板}
知识点:
DataReader : 只进只读数据! 查询的,返回的是一个 SqlDataReader sdr 对象 (这个对象不能用new 创建, 用查询数据库返回的来赋值.. 它没有构造函数 sdr = cmd.ExecuteReader()
; )
- 一行一行的往前读取 , 只读 , 不能修改
- 适用于遍历数据
sdr | id | name | psw | BOF --每一个表的首部会有这个 常识 |
1 | zx | 123 | ||
2 | xd | 123 | ||
EOF --每个表的尾部会有这个 |
怎么读取sdr里面的数据,里面的数据是一行一行的集合
- sdr [ 下标 | "列名" ] : object 弱类型读取 -----------这个叫做索引器
- sdr.GetString( 下标 ); : string 强类型读取
-
他们的 优缺点?
- 第一个是 每次读取都要强转, 但是好处是 永远都不会报错
- 第二个是 只能读取string ,读取int(其他类型)会报错, 当然这个 Get类型(下标) 这个有很多种
SqlDataReader 读取的模板
using System.Data;
using System.Data.SqlClient;
namespace SqlHelper
{
void main ()
{
String sql = "";
String connStr = ""; //连接字符串
using(SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql,conn);
SqlDataReader sdr = cmd.ExecuteReader();
//TODO 想要的操作
sdr.Close();
conn.Close();
}
}
}
怎么判断sdr中是否有数据?
sdr.HasRows 是一个bool 类型的属性, true就是数据
什么是索引器呢?
其实索引器和数组功能很类似 , 只是多了一个 arr[下标 | "列名"] , 数组中没有用列名查找的方法
DataAdapter : 断开式的操作 : 通常和DataSet一起用
DataSet 很重要, 对于效率, 方便性都很好
DataSet有什么组成??
-
DataTable //表
- DataRowCollection //行
- DataColumnCollection //列
- ConstraintCollection //约束
- DataRelationCollection //表之间的关系
DataSet标准模板如下:
步骤如下:
- DataSet dataSet = new DataSet();
- Sqlconnection conn = new SqlConnection(connStr);
- SqlDataAdapter sda = new SqlDataAdapter(sql,conn);
- sda.Fill(dataSet , "表名 习惯用temp");
- dataGridView.DataSource = dataSet.Tables["temp"];
前四句可以原原本本的封装起来,第五句稍微修改一下 return dataSet.Tables["temp"] ; 这样就可以了
- /* DataGridView 中的属性 有一个是 DataPropertyName 把DataTable 中的表的列 与数据库列名绑定 , 这个输出在表格的列名就不会是数据库中的名称了*/