/************************
*功能说明:Linq增删改查,以及sql注入
*创建时间:2012-7-10
*创建人:紫樱桑
*备注:;欢迎转载,以及提出宝贵的意见,本人才疏学浅,愿共同探讨
***************************/
使用linq开发的企业,现在已经很多了,然而还是有很多人没来得及接触到linq,为了给像我那样简单入门的人做个例子,所以发布了这个.这方面的资料,在网上很多..
首先说说这个Linq的lambda表达式,刚开始接触的时候,觉得特别奇怪 => 这是个什么符号,箭头吗?还是我看错了
int[] a = { 1,2,3,45,5,6,7};//声明一个int 数组
var m=a.Count(c=>c%2==1);//我是用的是 var声明的变量 ,我当时看到这个的时候,一直在想这两行代码到底是干什么的, 经测试,得到 m的值是4 ,也就是在这个a数组中,基数的个数为4 ;这个我清楚了以后,就在看这个c ,鼠标移上去,发现他是一个int类型的 我就搞不明白了,c什么时候开始声明的,为什么它是int,而不是其他的类型,带着这些疑问,我对Lambda产生了兴趣,继而后来看了下linq,以及C# 4.0新增的F#语言 后来深感Lambda表达式的强大.或许以后我们的代码都可以简化了吧.拭目以待
言归正传,看下面的界面图片
增加的
查询 修改 删除
界面已经确定好了,还是先去处理下数据吧.我用的是(VS2010 专业版) 网站右键添加新建项,数据里面有Linq to sql类,直接添加
添加完成以后,你会有一个 DataClasses1.dbml这样的文件 ,双击打开 发现里面'什么也没有',我的做法是,点击VS上面的 工具->连接到数据库(跟连接sqlServer一样的)
->打开左边的服务器资源管理器->打开相应的数据结构,找到相应的表,把这个表直接拖进 刚打开 DataClasses1.dbml的窗口 你看到窗口上是表名 还有属性(后面是对应的字段),就这一步,VS已经帮你做了很多事情了.
下面看代码:增加页面的 点击增加进去的
protected void Button1_Click(object sender, EventArgs e) { string name = this.TextBox1.Text;//取得页面上的值 string age = this.TextBox2.Text; string uid = this.TextBox3.Text; string pwd = this.TextBox4.Text; try { using (DataClasses1DataContext dc=new DataClasses1DataContext ()) { Mulberry mu = new Mulberry();//表的名称 mu.name = name;//表的字段 mu.age = age; mu.uid = uid; mu.pwd = pwd; dc.Mulberry.InsertOnSubmit(mu);//直接操作对象,把一个对象,添加到表里面 dc.SubmitChanges();//提交更改,不提交,数据库里面的数据不会变 } } catch { } }
--------------------------------------下面是 查询 修改 删除-------------------------------------------------
public partial class Select : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Bind(); } } /// <summary> /// 初始化绑定数据 /// </summary> public void Bind() { using (DataClasses1DataContext dc=new DataClasses1DataContext ()) { List<Mulberry> list = dc.GetTable<Mulberry>().ToList();//查询,得到了这个数据集 this.gv_message.DataSource = list; this.gv_message.DataBind(); } } protected void ddl_list_SelectedIndexChanged(object sender, EventArgs e) { //下拉框的值改变 if (ddl_list.SelectedValue==null) { return; } try { int id = int.Parse(this.ddl_list.SelectedValue); using (DataClasses1DataContext dc = new DataClasses1DataContext()) { Mulberry mu = dc.Mulberry.Where(c => c.id == id).Single(); this.TextBox1.Text=mu.name; this.TextBox2.Text=mu.age.ToString(); this.TextBox3.Text=mu.uid; this.TextBox4.Text=mu.pwd; } } catch { } } protected void ddl_list_DataBound(object sender, EventArgs e) { this.ddl_list.Items.Insert(0, new ListItem("--请选择--", "")); } protected void Button1_Click(object sender, EventArgs e) { //修改 if (this.ddl_list.SelectedValue == null) { return; } string name = this.TextBox1.Text; string age = this.TextBox2.Text; string uid = this.TextBox3.Text; string pwd = this.TextBox4.Text; try { int id = int.Parse(this.ddl_list.SelectedValue); using (DataClasses1DataContext dc = new DataClasses1DataContext()) { Mulberry mu = dc.Mulberry.Where(c => c.id == id).Single(); mu.name = name; mu.age = age; mu.uid = uid; mu.pwd = pwd; dc.SubmitChanges();//直接就这样修改了 } Bind();//修改以后重新绑定数据 } catch { } } protected void Button2_Click(object sender, EventArgs e) { //删除 if (this.ddl_list.SelectedValue == null) { return; } try { int id = int.Parse(this.ddl_list.SelectedValue); using (DataClasses1DataContext dc = new DataClasses1DataContext()) { Mulberry mu = dc.Mulberry.Where(c => c.id == id).Single();//得到这个对象 dc.Mulberry.DeleteOnSubmit(mu);//删除的关键DeleteOnSubmit()方法 dc.SubmitChanges(); } Bind(); } catch { } } }
---------------------最后总结--------------------------
linq操作其实很方便,省去了 一系 用sql语句,链接数据库等操作,更方便的实例化得到一个List<T>的集合,(本人操作习惯,以List<T>传递数据,一些公司还是用的DataTable)
许多的过程我们不用去关注了,我们要做的,就是操作对象,这个也完全符合 面向对象的特点,增删改查(IDUS)操作可以说是基本的,掌握了这个,就可以简单的做一些功能了
linq to sql 有关的,可以去网上去查些资料.
-----------------------另外补充一点,那就是数据的安全性, 常规的我们可能需要考虑sql注入问题,如果不是特别的清楚sql注入的,建议使用linq------------------------
linq可以有效避免sql注入.常见的注入我说一点 就是 这种
string sql = string.Format("select * from login where username='{0}' and password='{1}'",name,pwd);
当传入的 name="a" pwd="s' or '1'='1" 时,拼接得到的sql语句为
select * from login where username='a' and pwd='s' or '1'='1' 执行的结果,会把整个login 表 的数据查出来;
有效避免的方式 之一是 把传进来的参数 的 ' 替换成 '' (把一个单引号,替换成2个单引号),另外一种,就是使用 参数化查询
string sql = "select * from login where username=@a and password=@b";//然后去指定 @a,@b 所对应的值,看起来有点像是在执行存储过程传递参数吧,原理是一样的
/// 使用Linq
public string retResult(string name,string pwd) { using (DCClass2DataContext dc=new DCClass2DataContext ()) { try { Login lo = dc.Login.Where(c => c.password == pwd && c.username == name).Single(); if (lo != null) { return string.Format("使用Linq提交成功!</br>用户名:{0}</br>密码{1}", lo.username, lo.password); } else { return "使用Linq登录失败"; } } catch { return "使用Linq登录失败"; } } } //使用普通sql public DataTable getResult(string name, string pwd) { string sql = string.Format("select * from login where username='{0}' and password='{1}'",name,pwd); DataTable dt= new DBHelper().GetTable(sql); if (dt.Rows.Count>0) { return dt; } else { return null; } } /// 使用参数化查询 public DataTable getResultByParms(string name, string pwd) { // string sql = string.Format("select * from login where username='{0}' and password='{1}'", name, pwd); string sql = "select * from login where username=@a and password=@b"; //指定参数的值 SqlParameter[] parms = new SqlParameter[] { new SqlParameter("@a",name),new SqlParameter("@b",pwd) }; DataTable dt = new DBHelper().GetTable(sql, parms);//后面是我写的方法 if (dt.Rows.Count > 0) { return dt; } else { return null; } }
------------,由于篇幅太大,另外附上部分 DBHelper类 参数化查询 的代码
public bool ExecuteNonQuery(string sqlStr, SqlParameter[] paras) { //string connStr ="Data Source=.;Initial Catalog=BookStore;Persist Security Info=True;User ID=sa;Password=******";//直接连接 string connStr = ConfigurationManager.ConnectionStrings["BookStoreConnectionString"].ConnectionString;//读取配置文件 SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = new SqlCommand(sqlStr, conn); cmd.Parameters.AddRange(paras);// AddRange()这个会自动去加载 参数 int result = cmd.ExecuteNonQuery(); return result > 0; }
-----感觉内容有点多,而且感觉有些写的还不是很清楚------请多多指教-----