热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linqtosql插入值以及如何取回自增的ID

linqtosql在插入值的时候还是很方便。有时候我们需要在插入一个新实体之后得到那个实体的主键ID的值,这个ID当然必须是自增。一段时间我一直认为直接使用linqt

linq to sql 在插入值的时候还是很方便。有时候我们需要在插入一个新实体之后得到那个实体的主键ID的值,这个ID当然必须是自增。一段时间我一直认为直接使用linq to sql的插入机制是不可以在做到的,所以只有使用存储过程的,具体可以查看这篇文章:http://blog.benhall.me.uk/2008/01/custom-insert-logic-with-linq-to-sql.html,但是总是觉得这样太麻烦了。通过观察linq to sql插入之后产生的sql发现,它自动生成了两条语句,一条insert,一条select,而且那条select正好就是查询的最后生成的主键ID,真是不可思议呀。。

下面以一个实际的代码演示一下:

1.新建一个新闻表:

列名             数据类型                        允许为NULL         默认值             主键
----------------------------------------------------------------------------
ID                 int                                                       自增                是
Title              nvarchar(200)                                   
PubDate        datetime                                              getdate()     
Tag               nvarchar(200)                 是                

2.通常的做法就是新建一个Linq to sql 的类文件,然后通过可视化设计器把数据表拖到设计器中,但是这样一"托"永逸的做法是根本不行的,还要需要修改一些地

方,数据库中默认值的字段除了主键在自动生成的linq to sql的类文件中所对应的属性上面的列特性是没有标记IsDbGenerated=true的,这一点是必须要修改的。

在本例中要修改的就是在Pubdate属性把IsDbGenerated=true添加上,当然也可以在可视化的方式修改:

3.下面就来测试linq to sql 中插入值所产生的sql语句:

using (DemoDataContext db = new DemoDataContext())
            {
                db.Log = new WebApp.DataServer.DebuggerWriter();
                News news = new News { Title = "测试" };
                db.News.InsertOnSubmit(news);
                db.SubmitChanges();
            }

对应产生的sql语句:

看的很清楚一条insert ,一条select   ,注意select中的字段正式设置了默认生成的字段。如果我们不想让设置了默认值的字段不出现在select语句中我们可以那那个属性上的Column特性上设置AutoSync=AutoSync.Never,比如我们在本例中的Pubdate字段的属性上设置AutoSync=AutoSync.Never,则生成的语句的select字段中就不会出现Pubdate:

4.解决问题:

linq to sql   在插入值的时候会"无缘无故"的时候会产生select语句,真的很神奇,这个select并不是没有用的,从select的意思我们可以看出他正好查询了我们想要的字段的值,但是怎么得到他们呢,明明查询了,现在有什么办法可以得到呢?其实很简单:

using (DemoDataContext db = new DemoDataContext())
            {
                db.Log = new WebApp.DataServer.DebuggerWriter();
                News news = new News { Title = "测试" };
                db.News.InsertOnSubmit(news);
                db.SubmitChanges();
int newsID = news.ID;
            }

就是在提交之后访问那个刚刚插入的实体的ID属性就可以了。

5.下面我们测试一下,如果批量添加能不能得到那些自增的ID?

代码:

using (DemoDataContext db = new DemoDataContext())
            {
                db.Log = new WebApp.DataServer.DebuggerWriter();
                var newsList = new List
                {
new News{Title="测试1"},
new News{Title="测试2"},
new News{Title="测试3"},
                };
                db.News.InsertAllOnSubmit(newsList);
                db.SubmitChanges();
                var IDList = newsList.Select(n => n.ID);
            }

  下面是生成的Sql语句:

下面是监视IDList的结果,真是每个新插入数据的ID值:

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

第二篇文章:

就是有一个表中有一个字段为ID,并设置为Identity自动增长值,我们在为这样的表添加记录时,我们是不用给定ID值的。但是在使用Linq来添加记录时,会出现一些问题,就是每次添加新记录时,如果不给定ID号,那么它就会自动给ID一个0值,而ID是主键,当然不能重复,这样就导致如果不给定ID值,就只能自动添加一条记录,而且ID的值为0。

为了解决这个问题,我到网上找了好多资料,基本上没找到解决方法,最后一开窍,试着用英文关键字linq identity_insert到谷歌里面搜索,结果还真让我找到了。

原文如下:


There is a property of Column attribute (of System.Data.Linq.Mapping namespace) called IsDbGenerated. When you add this property for a Column and set it to true, it says the DataContext that column will be filled by the database i.e. its value will be generated by the database. This is very useful for Identity Columns. In this case, you also donot required to set the IDENTITY_INSERT on. So, suppose we have an identity column say "UserID", and we want to insert a row in our database table named say "TestTable". The code to do this is as follow
//In the class TestTable (which is mapped for LINQ)
[Column (Name="UserID",IsDbGenerated=true,DbType="int Not Null IDENTITY")]
public int UserID
{

get;
set;

}
//In the class where you want to insert row into table TestTable
TestDBDataContext tdb=new TestDBDataContext(ConnString);
tdb.TestTable.InsertOnSubmit(newRow);
tdb.SubmitChanges();
In this way you can insert a new row.


我的实践证明,只要在

[Column (Name="UserID",DbType="Int Not Null")]

行中加一个IsDbGenerated=true就可以了。

[Column (Name="UserID",IsDbGenerated=true,DbType="int Not Null IDENTITY")]

转:https://www.cnblogs.com/axyz/archive/2011/03/08/1977419.html



推荐阅读
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文讨论了在使用sp_msforeachdb执行动态SQL命令时,当发生错误时如何捕获数据库名称。提供了两种解决方案,并介绍了如何正确使用'?'来显示数据库名称。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
author-avatar
爱夫777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有