Linq增删改查

/************************

*功能说明: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;
}

 

-----感觉内容有点多,而且感觉有些写的还不是很清楚------请多多指教-----

 

 

转载于:https://www.cnblogs.com/limiao/archive/2012/07/10/2585258.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值