当前位置: 代码网 > it编程>编程语言>C# > C#数据库操作之LINQ to SQL技术详解

C#数据库操作之LINQ to SQL技术详解

2025年02月14日 C# 我要评论
一、linq to sql技术概述linq to sql 是 .net framework version 3.5 的一个组件,提供了用于将关系数据作为对象管理的运行时基础结构。在 linq to s

一、linq to sql技术概述

linq to sql 是 .net framework version 3.5 的一个组件,提供了用于将关系数据作为对象管理的运行时基础结构。

在 linq to sql 中,将关系数据库的数据模型,映射到一种对象模型中,该对象模型省指开发人员使用的编程语言表示的对象。通俗来讲,就是将数据库中的关系型数据,映射到代码里的实例对象。 当应用程序运行时,linq to sql 会将对象模型中的语言集成查询转换为 sql语句,然后将它们发送到数据库进行执行。 当数据库返回结果时,linq to sql 会将它们转换回你可以用你自己的编程语言处理的对象。

【tips】使用visual studio的开发者可以使用对象关系设计器the object relational designer,它为实现linq to sql的许多特性提供了一个用户界面。

二、使用linq to sql 进行简单操作.

通过使用 linq to sql,使得访问 sql 数据库,就像访问内存中的集合一样。

以下代码,创建一个northwnd对象,代表northwnd数据库,并从customers表中查询出城市为“london”的数据,返回一个集合,赋值给companynamequery,之后通过循环,输出集合内的元素。

// northwnd inherits from system.data.linq.datacontext.
northwnd nw = new northwnd(@"northwnd.mdf");
// or, if you are not using sql server express
// northwnd nw = new northwnd("database=northwind;server=server_name;integrated security=sspi");

var companynamequery =
    from cust in nw.customers
    where cust.city == "london"
    select cust.companyname;

foreach (var customer in companynamequery)
{
    console.writeline(customer);
}

通过上述例子中,相必您已经体会到了linq to sql技术的强大之处了,接下来,我将带领你们逐步的吸收linq to sql技术。

三、如何动态创建数据库

在linq to sql技术中,对象模型和关系型数据库之间是映射关系。要想启用映射关系,一般可以通过使用基于特性的映射,或者是使用描述关系数据库结构的外部映射文件。在这两种情况下,如果你有足够的关系型数据库的信息,那么就可以通过使用datacontext.createdatabase()方法来创建数据库实例。

datacontext.createdatabase()方法,仅在对象模型中被编码信息的范围内创建数据库的副本。对象模型中的映射文件和特性,不会对现有数据库结构的所有内容进行编码。映射信息不表示用户自定义函数、存储过程、触发器或检查约束的内容。这种行为对于各种数据库来说已经足够了。

如果已知的数据提供者是可用的(如sql server 2008),那么你可以在任何情况下使用datacontext.createdatabase()方法。

  • →构建一个自动安装在客户系统上的应用程序。
  • →构建一个客户机应用程序,该应用程序需要一个本地数据库来保存其脱机状态。

您还可以使用datacontext.createdatabase()方法来使用sql server,通过创建.mdf文件或目录名,具体是哪种取决于您的连接字符串。linq to sql 使用连接字符串来定义将要创建的数据库,以及要创建数据连接的服务器。

【tips】尽可能的,请使用windows集成安全性连接到数据库,以便在连接字符串中不需要密码。

案例一:

该例展示了一个如何创建一个名为mydvds.mdf数据库的方式。

//在使用该例展示的方法之前,必须进行以下两个步骤:
//1、添加引用system.data.linq;
//2、使用using语句,添加命名空间,否则报错
//   using tableattribute = system.data.linq.mapping.tableattribute;
//   using columnattribute = system.data.linq.mapping.columnattribute;

//table特性,创建了数据库中的名为dvdtable的表与该类之间的映射关系。
[table(name = "myorders")]
public class order
{
	//column特性,创建了dvdtable表中同名列与该类成员属性之间的映射关系。
	[column(isprimarykey = true)]
	public int id;
	[column]
	public string name;
	[column]
	public datetime date;

	public override string tostring()
	{
		return "order对象:{" + id + "," + name + "," + date + "}";
	}
}

//自定义类 ,继承datacontext类。
public class myorders : datacontext
{
    public myorders(string connection) : base(connection)
    {
    }

    public table<order> orders;
}

//创建一个myorders 类的对象db,该类继承自datacontext类。
myorders myorders = new myorders(@"d:\myfirstorder.mdf");

public void createdatabase()
{
    if (myorders.databaseexists())
    {
        //先判断该路径中,是否存在该数据库文件,如果存在,则删除。
        messagebox.show("deleting old database...");
        myorders.deletedatabase();
    }
    //myorders对象创建数据库
    myorders.createdatabase();
    //释放datacontext实例,所使用的的所有资源
    //myorders.dispose();
}

【注意】

myorders myorders = new myorders(@"d:\myfirstorder4.mdf");

语句中的myorders对象,最好设置成全局变量,如果设置成局部变量,后续在重复的调用方法时,可能会出现“该数据库已存在,请选择其他数据库名称”异常。

在构建自动安装在客户系统上的应用程序时,请先查看数据库是否已经存在,并在创建新数据库之前删除它。datacontext类提供databaseexists()和deletedatabase()方法来帮助您完成这个过程。

四、如何向数据库中insert数据

通过向关联的linq to sql里的table<tentity>集合添加对象,然后向数据库提交更改,您就可以将行插入到数据库中。link to sql将您提交的更改,翻译成适当的sql insert语句,然后提交到数据库执行的。

【tips】您也可以为linq to sql里默认的insert数据库、update数据库、delete数据库等操作进行重载。

以下步骤假设有一个连接到northwind数据库的datacontext连接。

  • 1、创建一个新对象,包含要提交的列数据。
  • 2、将新对象添加到与数据库中目标表相关联的linq to sql table集合中。
  • 3、提交更改到数据库中。

下面代码展示了创建一个新的order对象(order是用户自定义类),然后为它填充适当的属性值。之后将新的order对象添加到order集合里。最后,将更改提交到数据库,作为orders表中一个新的行。

// create a new order object.order class is user defined class.
order ord = new order
{
    id = 12000,
    name = "harry potty",
    orderdate = datetime.now
    // …
};

// add the new object to the orders collection.
system.data.linq.table<order> table = myorders.gettable<order>();
table.insertonsubmit(ord);

// submit the change to the database.
try
{
    myorders.submitchanges();
}
catch (exception e)
{
    messagebox.show(e.message);
    // make some adjustments.
    // ...
    // try again.
    myorders.submitchanges();
}
//释放资源
//myorders.dispose();

【注意】在向数据库中的表里,insert数据或者后续的update、delete操作时,无论您对对象做了多少项更改,都只是在更改内存中的副本。 您并未对数据库中的实际数据做任何更改。 直到您对 显式调用datacontext里的submitchanges()方法 ,您所做的更改才会传输到服务器。

五、如何从数据库中query数据

linq to sql 中的查询使用与 linq 中的查询相同的语法。 唯一的差异是 linq to sql 查询中引用的对象映射到数据库中的元素。 有兴趣的朋友,可以看下 linq 查询知识。

下面的代码,展示了一个简单的查询请求,查询出id等于12000的订单,并将查询结果输出。

myorders myorders = new myorders(@"c:\northwnd.mdf");
system.data.linq.table<order> table = myorders.gettable<order>();

// query for customers in london.
iqueryable<customer> custquery =
    from order in myorders.orders
    where order.id == 12000
    select order;

//将查询结果输出
foreach( var o in result)
{
	console.writeline(o.tostring());
}

从数据库中查询数据,还有更多复杂的操作,后续我会继续整理更为详细的数据库查询操作,可以先关注下。

六、如何update表中的数据

通过修改与linq to sql 的table集合相关联的对象的成员值,然后将更改提交给数据库,那么就可以更新数据库中的某行数据。linq to sql 将你的改变转换为相对应的sql update语句。

将某行数据更新到数据库中的步骤如下:

1、在数据库中查询要更新的行。

2、对第1步的linq to sql 查询结果里的成员值进行所需的更改。

3、将更改提交到数据库里。

下面的示例在数据库中查询订单#11000,然后更改结果order对象中的name和date的值。最后,对这些成员值的更改作为name和date列中的更改提交给数据库。

// query the database for the row to be updated.
var query =
    from ord in myorders.orders
    where ord.id== 11000
    select ord;

// execute the query, and change the column values
// you want to change.
foreach (order ord in query)
{
    ord.name = "hong lou meng";
    ord.date = datetime.now;
    // insert any additional changes to column values.
}

// submit the changes to the database.
try
{
    myorders.submitchanges();
}
catch (exception e)
{
    messagebox.show(console.writeline(e));
    // provide for exceptions.
}
//释放datacontext对象占用的资源。
//myorders.dispose();

七、如何如何delete表中的数据

可以通过从与表相关联的集合中删除相应的linq to sql对象,来完成对数据库中某行的删除。linq to sql 会将删除操作转变为适当的sql delete语句。

linq to sql不支持或不识别级联删除操作。如果你想删除表中有约束的一行,你必须完成以下其中一项条件:

1、在数据库的外键约束中设置on delete cascade规则。

2、使用您自己的代码先删除阻止父对象被删除的子对象。

如果无法保证上述至少一个条件成立,则将抛出异常。请参阅本主题的第二个代码示例。

删除数据库中某一行的操作如下:

  • 1、在数据库中查询需要删除的行。
  • 2、调用deleteonsubmit方法。
  • 3、将删除操作提交到数据库。

下面的第1个代码示例向数据库查询属于order# 11000的订单详细信息,将这些订单详细信息标记为删除,并将这些更改提交给数据库。

table<order> orders = myorders.gettable<order>();
// query the database for the rows to be deleted.

var deleteresult =
    from ord in orders
    where ord.id == 11000
    select ord;

foreach (var ord in deleteresult )
{
    orders.deleteonsubmit(ord );
}

try
{
    myorders.submitchanges();
}
catch (exception e)
{
    messagbox.show(e.message);
    // provide for exceptions.
}

在第二个代码示例中,目标是删除一个订单(#10250)。代码首先检查orderdetails表,以查看要删除的订单在那里是否有子订单。如果订单有子订单,则首先将子订单标记为要删除,然后将订单标记为要删除。datacontext将实际的删除按正确的顺序排列,以便发送到数据库的删除命令遵守数据库约束。

//northwnd myorders = new northwnd(@"c:\northwnd.mdf");

myorders myorders = new myorders(@"d:\myfirstorder.mdf");

myorders.log = console.out;

// specify order to be removed from database
int reqorder = 10250;

// fetch orderdetails for requested order.
var orddetailquery =
    from odq in myorders.orderdetails
    where odq.orderid == reqorder
    select odq;

foreach (var selecteddetail in orddetailquery)
{
    messagebox.show(selecteddetail.tostring());
    myorders.orderdetails.deleteonsubmit(selecteddetail);
}

// display progress.
messagebox.show("detail section finished.");

// determine from detail collection whether parent exists.
if (orddetailquery.any())
{
    messagebox.show("the parent is present in the orders collection.");
    // fetch order.
    try
    {
        var ordfetch =
            (from ofetch in myorders.orders
             where ofetch.orderid == reqorder
             select ofetch).first();
        myorders.orders.deleteonsubmit(ordfetch);
        messagebox.show("{0} orderid is marked for deletion.", ordfetch.orderid);
    }
    catch (exception e)
    {
        messagebox.show(e.message);
    }
}
else
{
    messagebox.show("there was no parent in the orders collection.");
}

// display progress.
messagebox.show("order section finished.");

try
{
    myorders.submitchanges();
}
catch (exception e)
{
    messagebox.show(e.message);
}

// display progress.
messagebox.show("submit finished.");

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

  • C#中闭包的实现和注意事项详解

    C#中闭包的实现和注意事项详解

    闭包的定义闭包并不是某一个语言中特有的概念,在主流的编程语言中都有这个特性。闭包可以让一个内部方法可以访问它所在外部方法中的变量,并可以对变量的值进行修改,即使... [阅读全文]
  • .NET利用C#字节流动态操作Excel文件

    .NET利用C#字节流动态操作Excel文件

    在.net开发中,通过字节流动态操作excel文件提供了一种高效且灵活的方式处理数据。这种方法允许开发者直接在内存中创建、修改和保存excel文档,无需依赖直接... [阅读全文]
  • c#实现繁体转简体的示例代码

    c#实现繁体转简体的示例代码

    在软件开发中,使用了syncfusion第三方控件,syncfusion通过资源库实现汉化,但syncfusion提供的资源库sfresources.zh.re... [阅读全文]
  • 基于C#实现将图片转换为PDF文档

    基于C#实现将图片转换为PDF文档

    介绍将图片(jpg、png)转换为pdf文件可以帮助我们更好地保存和分享图片。此外,pdf文件还具有强大的安全特性,将图片转换为pdf后,我们可以通过设置密码来... [阅读全文]
  • C# Record关键字示例详解

    C# Record关键字示例详解

    在 c# 9.0 中引入了 record 关键字,用于定义记录类型(record types)。记录类型是一种轻量级的数据载体,专注于表示数据,它提供了内置的相... [阅读全文]
  • WPF实现曲线数据展示

    wpf实现曲线数据展示,函数曲线展示,实例:震动数据分析为例。如上图所示,如果你想实现上图中的效果,请详细参考我的内容。一共有两种方式来实现,一种是使用第三方的框架来实现,另外一种…

    2025年02月14日 编程语言

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com