easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)

easyui datagrid 禁止选中行

 

 

 

没有找到可以直接禁止的属性,但是找到两个间接禁止的方式。

方式一:

//onClickRow: function (rowIndex, rowData) {
     // $(this).datagrid('unselectRow', rowIndex);
//},

方式二:
onClickRow: function () {
    $('#gvStlxtjb').datagrid('clearSelections');
},

 

参考内容:https://bbs.csdn.net/topics/390490560

树立目标,保持活力,gogogo!
 
 

EF的增删改查(转载)

 

EF的增删改查

 

创建上下文对象:WordBoradEntities db = new WordBoradEntities();

一、添加:

  //1.1创建实体对象

            User uObj = new User()

            {

                uName = "刘德华",

                uLoginName = "aaa",

                uPwd = "asdfasdfasdfsadf",

                uIsDel = false,

                uAddtime = DateTime.Now

            };

            //1.2通过EF添加到数据库

            //1.2.1将对象加入到数据上下文 User集合中

            db.Users.Add(uObj);

            //1.2.2调用数据上下文保存方法,将对象存数数据库

            db.SaveChanges();

 

二、查询:

1、单行   var userLogin = db.T_UserLogin.Where(d => d.LoginID == loginID).FirstOrDefault();

2、多行

1)var  list = db.Users.Where(u => u.uName == "刘德华").ToList();

2)List<User> list = db.Users.Where(u => u.uName == "刘德华").ToList();

3、连接查询:

1)linq连接查询: from a in db.User join b in db. UsersAddresses  on a.Id equals b.udid

2)EF连接查询:IQueryable<UsersAddress> addrs = db.User.Include("UsersAddresses").Where(a => a.Id == 1);

3)另一种连接查询:var list=db.User.Join(db. UsersAddresses,c=>c.Id,g=>g.udid,(c,g)=>new{Name=c.Name,GroupName=g.GroupName});

 

三、删除:

EF中实现删除有三种方式,版本一、二都是根据主键删除,版本三是根据任意条件到数据库查询然后再根据查询的结果进行删除,实际上版本三也是根据查询出来的结果中的主键进行删除。

1 :根据主键删除

  //实例化一个Users对象,并指定Id的值

  Users user = new Users() { Id = 1 };

  //user附加到上下文对象中,并获得EF容器的管理对象

  var entry = db.Entry<User>(user);或者 var entry=db.Entry(user);

  //设置该对象的状态为删除

  entry.State = EntityState.Deleted;

  //保存修改

  db.SaveChanges();

  Console.WriteLine("删除成功!");

2:根据主键删除

      //实例化一个Users对象,并指定Id的值

      Users user = new Users() { Id = 1 };

      //user附加到上下文对象中

      db.Users.Attach(user);

      //删除user对象

      Db.Users.Remove(user);

      //保存修改

      db.SaveChanges();

      Console.WriteLine("删除成功!");

  3:根据条件先查询出来然后再删除

var list= db.Users.Where(u => u.Name ==”张三”)

if(list!=null&&list.Any())

{

       Foreach(User item in list)

       {

       db.User.Remove(item);

}

}

db.SaveChanges();

 

四、修改:

1.官方推荐的修改方式(先查询,再修改)

//Id2Users数据取出

      var user = db.Users.Where(u => u.Id == 2).FirstOrDefault();

      Console.WriteLine("修改之前:" + user.UserName);

      //修改UserName属性

      user.UserName = "222222222222222";

      //保存修改

      db.SaveChanges();

Console.WriteLine("修改之后:" + user.UserName);

2.自己优化的修改方式

  //1)创建出一个要修改的对象

  User use = new User() { uId = 8,uName="小白~~~"};

  //2)对象加入 EF容器,并获取当前实体对象状态管理对象

  DbEntityEntry<User> entry = db.Entry<User>(user);

  //3)设置该对象为未被修改过

  entry.State = System.Data.EntityState.Unchanged;

  //4)设置该对象 uName属性修改状态,同时 entry.State 被修改为 Modified 状态

 entry.Property("uName").IsModified = true;

   //5)关闭EF实体合法性检查(如果创建出来的要修改的数据有的字段没有赋值则关闭实体合法性检查,如果所有字段都赋值了则不用关闭EF实体合法性检查)

    db.Configuration.ValidateOnSaveEnabled = false;

  //6)重新保存到数据库 -- ef 上下文根据实体对象的状态,根据 entry.State =Modified 的值生成对应的 update sql 语句.

    db.SaveChanges();

   Console.WriteLine("修改成功:");

 

五、增删改查的另一种方式,纯sql。

  当遇到复杂的需求,需要书写复杂语句,但有不特别熟悉EF语法时有两种方案:

  1.数据库中创建视图;

  2纯sql方式;

  //1)查询SqlQuery

   result.slList = db.Database.SqlQuery<DataTemp>("select Precision,Year,LandCover, sum(Area) as Area  from [EcoTypes]  where  LandCover=@type group by Precision, Year, LandCover", new SqlParameter("@type", "森林")).Select(d=> d.Area).ToList();

       //2)增删改:ExecuteSqlCommand 

      db.Database.ExecuteSqlCommand("").ToString();

      详情请db.Database. 此时会出现所有方式和相应的说明文本。  

  注释: db是视图对象模型。

   EcologyEntities db = new EcologyEntities();

 

六、当以上方法都不能满足是,大不了写点原生ADO代码,一个项目两种ORM也是可以的,只要能解决复杂问题。

 

 转载来源 https://www.cnblogs.com/zhuyuchao/p/5634196.html

 

 

 

C# 获取用户IP地址(转载)

 

  说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己在项目中做过的事情,同时也想抛砖引玉。参考的博文及其作者在下文均有提及。待到自己以后对HTTP、TCP/IP等知识学深入了,一定再来这里深入讨论这个内容。

 

一、名词

  首先说一下接下来要讲到的一些名词。

  在Web开发中,我们大多都习惯使用HTTP请求头中的某些属性来获取客户端的IP地址,常见的属性是REMOTE_ADDRHTTP_VIAHTTP_X_FORWARDED_FOR。

  这三个属性的含义,大概是如此:(摘自网上,欢迎指正)

  REMOTE_ADDR:该属性的值是客户端跟服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。

  X-Forwarded-For:是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。

    XFF的有效性依赖于代理服务器提供的连接原始IP地址的真实性,因此, XFF的有效使用应该保证代理服务器是可信的, 比如可以通过创建可信服务器白名单的方式。

  这一HTTP头一般格式如下:

  X-Forwarded-For: client1, proxy1, proxy2

  其中的值通过逗号+空格,把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。

  鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。

  (另附维基中对X-Forwarded-For的完整介绍:http://zh.wikipedia.org/wiki/X-Forwarded-For

 

  至于在使用这些属性的时候,属性的值是什么,网上查到一份这样的博文:获取用户IP地址的三个属性的区别(原作者不详)。

  

  而在ASP.NET中,还可以通过另外一种方式获得客户端的IP地址,那就是通过Request对象中的UserHostAddress属性。在MSDN Library中,对这个属性是这样解释的:属性值是远程客户端的 IP 地址。

  如果客户端使用了代理服务器,那么Request.UserHostAddress属性获得的就是代理服务器的IP地址。

 

二、方法

  好了,讲了那么多概念性的东西,咱们来讲一下实现的方法。

  网上大多数方法的思路是:如果有代理IP,则优先获取代理IP,否则获取连接客户端的IP;或者调转过来,先获取连接客户端的IP,如获取失败,则获取代理IP。

  以下方法参考博文 asp.net获取客户端IP  (作者comeonfyz)

-----------------------------------------------------------------------------------------------------------

复制代码
/// <summary>
/// 获取客户端IP地址
/// </summary>
/// <returns>若失败则返回回送地址</returns>
public static string GetIP()
{
    //如果客户端使用了代理服务器,则利用HTTP_X_FORWARDED_FOR找到客户端IP地址
    string userHostAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString().Split(',')[0].Trim();
    //否则直接读取REMOTE_ADDR获取客户端IP地址
    if (string.IsNullOrEmpty(userHostAddress))
    {
        userHostAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    }
    //前两者均失败,则利用Request.UserHostAddress属性获取IP地址,但此时无法确定该IP是客户端IP还是代理IP
    if (string.IsNullOrEmpty(userHostAddress))
    {
        userHostAddress = HttpContext.Current.Request.UserHostAddress;
    }
    //最后判断获取是否成功,并检查IP地址的格式(检查其格式非常重要)
    if (!string.IsNullOrEmpty(userHostAddress) && IsIP(userHostAddress))
    {
        return userHostAddress;
    }
    return "127.0.0.1";
}

/// <summary>
/// 检查IP地址格式
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public static bool IsIP(string ip)
{
    return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
}
复制代码

-----------------------------------------------------------------------------------------------------------

  但是这样做有一个很严重的缺陷,那就是如大牛Kingthy在其博文 使用HTTP_X_FORWARDED_FOR获取客户端IP的严重后果   中所说的,"HTTP_X_FORWARDED_FOR"这个值是通过获取HTTP头的"X_FORWARDED_FOR"属性取得的,恶意破坏者可以很轻松地伪造IP地址;而且上文特别提到过,XFF的有效性依赖于代理服务器提供的连接原始IP地址的真实性,因此, XFF的有效使用应该保证代理服务器是可信的。但是作为开发者,我们既不知道用户的IP地址的真实性,更是难以分辨代理服务器的可信性。

  因此,综合各个方面的资料,我个人的想法与大牛Kingthy一样:无视代理

-----------------------------------------------------------------------------------------------------------

复制代码
 1     /// <summary>
 2     /// 获取客户端IP地址(无视代理)
 3     /// </summary>
 4     /// <returns>若失败则返回回送地址</returns>
 5     public static string GetHostAddress()
 6     {
 7         string userHostAddress = HttpContext.Current.Request.UserHostAddress;
 8 
 9         if (string.IsNullOrEmpty(userHostAddress))
10         {
11             userHostAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
12         }
13 
14         //最后判断获取是否成功,并检查IP地址的格式(检查其格式非常重要)
15         if (!string.IsNullOrEmpty(userHostAddress) && IsIP(userHostAddress))
16         {
17             return userHostAddress;
18         }
19         return "127.0.0.1";
20     }
21 
22     /// <summary>
23     /// 检查IP地址格式
24     /// </summary>
25     /// <param name="ip"></param>
26     /// <returns></returns>
27     public static bool IsIP(string ip)
28     {
29         return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
30     }
复制代码

-----------------------------------------------------------------------------------------------------------

三、总结  

  无视代理服务器肯定不是最好的解决方案,如果项目需求明确说要客户端的真实地址,那肯定就不能无视代理服务器了。

  另外,我也向Artech大牛请教过这方面的问题,他虽然对这些没有深入的研究,但是他也认为没有一种IP获取方式是完全值得信赖的,因为这是TCP/IP协议本身决定的。

  附上Artech大牛给我的一份资料,分享分享。http://www.symantec.com/connect/articles/ip-spoofing-introduction

 

转载来源:https://www.cnblogs.com/stay-foolish/archive/2012/05/01/2475071.html

 

 

MVC EF 执行SQL语句(转载)

 

MVC EF 执行SQL语句

 

 

最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。

十年河东十年河西,莫欺少年穷

学无止境,精益求精

闲着没事,看了一篇关于LINQ和SQL对比的文章,网友们也是积极发言,有人说LINQ简单,维护了进程的可读性,易用性。有人说:LINQ的执行本质其实就是SQL,再好的LINQ也需要转化为SQL后才能和数据库交互,LINQ效率低。

在此,表达下观点:本人支持后者,也就是SQL。

那么,在EF中,我们怎样执行SQL呢?

在此,先贴出几张图,如下:

1、

 

2、

 

3、

4、

根据上图,我们得知,图一,图二两个方法执行返回Int的方法,诸如:Insert操作,Update操作,delete操作。图三,图四返回DbRawSqlQuery的方法,诸如:Select操作。

何为DbRawSqlQuery类型?如下:

由此可见DbRawSqlQuery类型继承自泛型类型。因此,图三图四用于执行Select操作的SQL语句。

那么,我们该怎么使用呢?

图一示例

db.Database.ExecuteSqlCommand("delete语句 或 Update语句 或 Insert语句 ");
db.Database.ExecuteSqlCommand("delete语句 或 Update语句 或 Insert语句 ",params object[] parameters);
复制代码
复制代码
        /// <summary>
        /// 学生Id
        /// </summary>
        /// <param name="i"></param>
        public StudentScore()
        {
            using (StudentContext db = new StudentContext())
            {
                int userid = 8;
                string name = "Jack";
                SqlParameter[] paras = new SqlParameter[] {
                     new SqlParameter("@userId",userid),
                     new SqlParameter("@searchName",name)
                    };
                db.Database.ExecuteSqlCommand("delete from S where userId=@userId or UserName=@searchName", paras);
            }

        }
复制代码
复制代码

图二实际上是执行存储过程:

复制代码
复制代码
        public StudentScore()
        {
            using (StudentContext db = new StudentContext())
            {
                db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,"exec ProcName ");
            }
        }
复制代码
复制代码

图三、图四执行查询操作,如下所示:

复制代码
复制代码
    public class StudentScore
    {
        public IEnumerable<Student> StudentModel { get; set; }//
        public IEnumerable<Course> CourseModel { get; set; }
        public IEnumerable<Score> ScoreModel { get; set; }
        //
        public List<StudentScoreVM> StudentScoreList = new List<StudentScoreVM>();

        public StudentScore()
        {
        }
        /// <summary>
        /// 学生Id
        /// </summary>
        /// <param name="i"></param>
        public StudentScore(int Id)
        {
            using (StudentContext db = new StudentContext())
            {
                //返回StudentScoreVM对象集合 通过这种方式可实现ViewModel特性
                StudentScoreList = db.Database.SqlQuery<StudentScoreVM>("select A.StudentScore,B.Name courseName,C.Name stuName,C.Sex,C.StudentAddress,C.StudentNum from dbo.Score A left join dbo.Course B on A.CourseID=B.Id left join dbo.Student C on A.StudentID=C.Id where 1=1 and C.Id=" + Id + "").ToList();
                //返回查询结果的课程名集合
                var stringList = db.Database.SqlQuery<string>("select B.Name courseName from dbo.Score A left join dbo.Course B on A.CourseID=B.Id left join dbo.Student C on A.StudentID=C.Id where 1=1 and C.Id=" + Id + "").ToList();
                //返回查询结果的年龄集合
                var intList= db.Database.SqlQuery<string>("select A.Age from dbo.Score A left join dbo.Course B on A.CourseID=B.Id left join dbo.Student C on A.StudentID=C.Id where 1=1 and C.Id=" + Id + "").ToList();
            }
        }
    }
复制代码
复制代码

总结如下:

通过 SQL 查询语句获取实体对象集

DbSet 类中的 SqlQuery 方法允许你执行一个返回实体对象集的原生 SQL 查询. 默认情况下, 返回的对象集会被上下文跟踪; 这可以通过对方法返回的 DbSqlQuery 对象调用 AsNoTracking 方法取消.返回的结果集一般为 DbSet 所对应的类型, 否则即便是其派生类也无法返回. 如果所查询的表包含了其他实体类型的数据, 那么所执行的 SQL 语句应该被正确书写, 保证只返回指定类型实体的数据. 下面的例子使用 SqlQuery 方法执行了一个 SQL 查询, 返回一个 Department 类型的实例集.

让数据库执行原生的非查询 SQL 命令

ExecuteSqlCommand 方法有时会被用在 Code First 创建的数据库的初始化函数中, 用来对数据库进行一些额外的配置 (例如, 设置索引). 需要注意的是, 上下文对象并不知道执行了 ExecuteSqlCommand 方法后数据库中的数据有什么改变, 除非你从数据库中载入或重新载入实体集.

 

调用存储过程

Code First 并不支持对存储过程的映射. 但是, 你可以通过 ExecuteSqlCommand 或 SqlQuery 方法直接调用存储过程. 例如: context.Database.ExecuteSqlCommand ("EXECUTE [dbo].[DoSomething]").

译注: 本文提到的三个方法 (DbSet.SqlQuery, Database.SqlQuery, Database.ExecuteSqlCommand) 都支持参数化查询, 用法和 string.Format 类似, 但是在查询执行时会对传入的参数进行类型转换. 如: context.Departments.SqlQuery("select * from Department where DepartmentID = {0}", "6"); 该语句执行时, 会将字符串 "6" 转化为整数然后再代入查询语句中执行, 可以有效防止 SQL 注入.

防止 SQL 注入攻击

应用进程经常要从外部获取输入 (来自用户和其他外部代理) , 然后根据这些输入执行相关操作. 从用户或外部代理直接或间接获取的任何信息都可能利用目标进程语言的语法来执行违法操作. 当目标语言是结构化查询语言 (SQL) 时, 例如 Transact-SQL, 这个操作被称为 SQL 注入攻击. 恶意的用户可以直接在查询中注入命令执行操作, 删除数据库中的一个表, 拒绝提供服务或修改正在执行的操作的性质. 故你应该使用参数化的查询, 而不是直接将从外部获取的字符串插入到查询字符串中.

 

转载来源:https://www.cnblogs.com/chenwolong/p/SqlQuery.html

 

 

在EF中执行SQL语句(转载)

 

在EF中执行SQL语句

 

你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了。话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除一组记录,如果按照正常的流程来走,你就得先把这些数据查出来,然后再一条一条地删除它们,这样不仅麻烦而且性能也比较低。这种情况下SQL就显示出它的威力了。

而使用EF执行SQL又比ADO.NET方便,特别是在执行查询语句的时候,EF会把查询到的数据自动保存到数据实体中,省去了使用DataReader的麻烦。同时查询出来的数据还会进行跟踪,如果你修改了查询出的值,之后就可以很方便的使用.SaveChanges()直接更新到数据库了。

ExecuteSqlCommand与SqlQuery

在数据上下文DBModel的实例中有个Database属性,其中有两组方法.ExecuteSqlCommand()和.SqlQuery()。它们都可以执行SQL语句,只不过.ExecuteSqlCommand()是不返回结果的,只返回受影响的行数,所以.ExecuteSqlCommand()更适合执行创建、更新、删除操作。.SqlQuery()则会返回查询到的结果,并将结果保存在数据实体中,所以更适合执行查询操作。

使用.ExecuteSqlCommand()实现创建、更新、删除

.ExecuteSqlCommand()的使用方法也很简单,直接传入SQL语句就可以了,执行完成后会返回受影响的行数。

  1. using (var db = new DBModel()) //创建数据库上下文
  2. {
  3. //同步的方式执行SQL,并返回受影响的行数
  4. int result = db.Database.ExecuteSqlCommand(@"CREATE TABLE `test`.`test` (
  5. `id` INT NOT NULL,
  6. PRIMARY KEY(`id`)); ");
  7. //使用SqlParameter传值可以避免SQL注入
  8. var p_name = new SqlParameter("@name", "萝莉");
  9. var p_age = new SqlParameter("@age", 13);
  10. //如果使用的是MySql数据库 需要SqlParameter把替换为MySqlParameter
  11. //var p_name = new MySqlParameter("@name", "萝莉");
  12. //var p_age = new MySqlParameter("@age", 13);
  13. //更改学生年龄
  14. result = db.Database.ExecuteSqlCommand(@"UPDATE `test`.`student`
  15. SET `age` = @age
  16. WHERE `name` = @name;", p_age, p_name);
  17. //异步的方式执行SQL,并返回受影响的行数
  18. Task<int> result2 = db.Database.ExecuteSqlCommandAsync("DROP TABLE `test`.`test`;");
  19. }

PS:如果需要创建或删除当前数据库,Database属性中还存在.Create() 和.Delete()方法,它们不接受参数,返回一个bool值表示执行成功或失败。

使用.SqlQuery()查询数据

从名字就看的出来.SqlQuery()是用来执行查询的。.SqlQuery()使用前需指定返回值的数据类型,比如我查询寻一条学生的完整信息,类型就可以指定为student类型。如果是统计有多少个学生,返回值是个整数,就以设置为int。

注意:不仅返回值的个数必须与传入类型中属性值的个数相同,而且名称还必须一样,不然会出错。那么如果我只想获取姓名和年龄,那就得单独定义一个类(其中包含一个string类型的name和int类型的age),来保存数据了。

 
  1. class temp
  2. {
  3. public string name { get; set; }
  4. public int age { get; set; }
  5. }
  6. static void Main(string[] args)
  7. {
  8. using (var db = new DBModel()) //创建数据库上下文
  9. {
  10. //查询叫萝莉的学生信息,并指定返回值类型为student
  11. DbRawSqlQuery<student> result1 = db.Database.SqlQuery<student>("SELECT * FROM test.student WHERE name = '萝莉'");
  12. //也可以这样指定返回值类型
  13. //DbRawSqlQuery result1 = db.Database.SqlQuery(typeof(student), "SELECT * FROM test.student WHERE name = '萝莉'");
  14. Console.WriteLine(result1.FirstOrDefault().name); //打印姓名
  15. DbRawSqlQuery<int> result2 = db.Database.SqlQuery<int>("SELECT count(*) FROM test.student");
  16. Console.WriteLine(result2.FirstOrDefault()); //打印有多少学生
  17. //只查询学生的年龄与姓名
  18. var result3 = db.Database.SqlQuery<temp>("SELECT `name`,`age` FROM test.student;");
  19. foreach (temp item in result3)
  20. {
  21. Console.WriteLine(item.name + ":" + item.age);
  22. }
  23. }

使用DbSet<T>下的.SqlQuery()

在每个数据实体集合DbSet<T>下也有一个.SqlQuery(),功能与上面介绍的一样,只不过DbSet<T>下的.SqlQuery()只能返回DbSet<T>中包含的类型。但DbSet<T>下的.SqlQuery()在返回数据的同时还会让数据库上下文(DBModel)跟踪返回数据的状态,如果返回的数据发生了修改,就可以使用.SaveChanges()将结果直接保存回数据库。而.Database.SqlQuery()查出的结果则是做不到的。

  1. using (var db = new DBModel()) //创建数据库上下文
  2. {
  3. //查询叫萝莉的学生信息,并修改她的年龄
  4. student result1 = db.students.SqlQuery("SELECT * FROM test.student WHERE name = '萝莉'").FirstOrDefault();
  5. result1.age = 13; //通过实体集合下.SqlQuery查询到的数据,修改之后是可以保存到数据库的
  6. student result2 = db.Database.SqlQuery<student>("SELECT * FROM test.student WHERE name = '旺财'").FirstOrDefault();
  7. result2.age = 21; //因为使用的是.Database.SqlQuery查询到的,所以这里的修改不会保存到数据库
  8. //如果希望.Database.SqlQuery下查出的数据在修改后也能保存到数据库
  9. student result3 = db.Database.SqlQuery<student>("SELECT * FROM test.student WHERE name = '小明'").FirstOrDefault();
  10. result3.age = 36;
  11. db.Entry<student>(result3).State = System.Data.Entity.EntityState.Modified; //通知数据上下文,这条记录也被修改了
  12. db.SaveChanges();
  13. }

转载来源:https://www.cnblogs.com/lgx5/p/5854887.html

 

 

 

EF中使用SQL语句或存储过程

 

EF中使用SQL语句或存储过程

 
1、无参数查询
var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoes ").ToList();
 
2、有参查询
var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoes where id=@ID ",new SqlParameter("@ID",id)).ToList();
 
3、结合linq查询
 
var model = (from in db.userinfo.SqlQuery("select * from UserInfoes where id=@ID"new SqlParameter("@ID", 1)) select p).ToList();
 
4:EF原始查询单独表
 
model = db.userinfo.OrderByDescending(a => a.ID).Skip(10 * (当前页 - 1)).Take(10).ToList();
 
 
5,EF 执行存储过程或delete 删除语句
 
SqlParameter[] para = new SqlParameter[] {
new SqlParameter("@ID",id)
};
db.Database.ExecuteSqlCommand("delete UserInfoes  where id=@ID", para);
 
存储过程 删除,有几个参数,存储后面要带几个参数以逗号分隔
 
SqlParameter[] para = new SqlParameter[] {
new SqlParameter("@ID",id)
};
db.Database.ExecuteSqlCommand("sp_Userinfos_deleteByID @ID", para);
 
转载来源:https://www.cnblogs.com/lvdongjie/p/5856306.html
树立目标,保持活力,gogogo!
 
 
 

.net MVC使用Session验证用户登录(转载)

 

 .net MVC使用Session验证用户登录

 

用最简单的Session方式记录用户登录状态

1.添加DefaultController控制器,重写OnActionExecuting方法,每次访问控制器前触发

复制代码
复制代码
    public class DefaultController : Controller
    {
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

            var userName = Session["UserName"] as String;
            if (String.IsNullOrEmpty(userName))
            {
                //重定向至登录页面
                filterContext.Result = RedirectToAction("Index", "Login", new { url = Request.RawUrl});
                return;
            }

        }
    }
复制代码
复制代码

2.登录控制器

复制代码
复制代码
    public class LoginController : Controller
    {
        // GET: Login
        public ActionResult Index(string ReturnUrl)
        {
            if (Session["UserName"] != null)
            {
                return RedirectToAction("Index", "Home");
            }
            ViewBag.Url = ReturnUrl;
            return View();
        }

        [HttpPost]
        public ActionResult Index(string name, string password, string returnUrl)
        {
            /*
                添加验证用户名密码代码
            */
            Session["UserName"] = name;
            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        // POST: /Account/LogOff
        [HttpPost]
        public ActionResult LogOff()
        {
            Session["UserName"] = null;
            return RedirectToAction("Index", "Home");
        }
    }
复制代码
复制代码

3.需要验证的控制器继承DefaultController

复制代码
复制代码
    public class HomeController : DefaultController
    {
        public ActionResult Index()
        {
            return View();
        }
    }
复制代码
复制代码

 


这种方式适合比较小的项目
优点:简单,易开发
缺点:无法记录登录状态,而且Session方式容易丢失
转载来源:https://www.cnblogs.com/pengdylan/p/6421440.html
树立目标,保持活力,gogogo!
 
 
 

PowerDesigner 参照完整性约束(转载)

 

 

PowerDesigner 参照完整性约束:

 

限制(Restrict):不允许进行修改或删除操作。若修改或删除主表的主键时,如果子表中存在子记录,系统将产生一个错误提示。这是缺省的参照完整性设置。

置空(Set Null):如果外键列允许为空,若修改或删除主表的主键时,把子表中参照的外键列设置为空值(NULL)。

置为缺省(Set Default):如果指定了缺省值,若修改或删除主表的主键时,把子表中参照的外键设置为缺省值(Default)。

级联(Cascade):把主表中主键修改为一个新的值时,相应修改子表中外键的值;或者删除主表中主键的记录时,要相应删除子表中外键的记录。

外键级联删除的时候,操作主表时会关联到子表,但是操作子表,不会关联到主表。

 

以下是几个参数的含义:

None:父表修改,子表不影响。

Restrict:父表修改,如果子表存在,则出错。

Cascade:父表修改,如果子表存在,则相应的修改。

Set Null:父表修改,如果子表存在,则相应置空。

Set Default:父表修改,如果子表存在,则相应置默认值。

 

 

另外:

功能:在删除主表时,自动删除副表(外键约束)相应内容

删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。

如:

 

复制代码
复制代码
create database temp go use temp go

create table UserInfo ( UserId int identity(1,1) primary key , UserName varchar(20), --用户名 
password varchar(20) not null --密码 ) create table UserDetails ( id int identity(1,1) primary key, name varchar(50) not null, --真实姓名
userId int, foreign key (userId) references UserInfo(UserId) on delete cascade ) insert UserInfo values ('ly','jeff') insert UserInfo values('wzq','wzqwzq') insert UserInfo values('lg','lglg') insert UserDetails values('李四',1) insert UserDetails values('王五',2) insert UserDetails values('刘六',3)
复制代码
复制代码


 

sqlserver 支持级联更新和删除

oracle 只支持级联删除

alter table 表名

add constraint 外键名

foreign key(字段名)

references 主表名(字段名)

on delete cascade


语法: Foreign Key (column[,...n]) references referenced_table_name[(ref_column[,...n])] [on delete cascade] [on update cascade]

注释:

column:列名

referenced_table_name:外键参考的主键表名称

ref_name:外键要参考的表的主键列

on delete:删除级联

on update:更新级联

 

此时:Delete From UserInfo Where UserId = 1 就可删除UserInfo表和UserDetails表的UserId=1 的内容

转载来源:https://www.cnblogs.com/zhtxl/p/3197104.html

关键词:nbsp gt db lt ip 数据 查询 sql id 执行

相关推荐:

ASP.NET MVC5+EF6+EasyUI 后台管理系统(89)-EF执行SQL语句与存储过程

MVC EF 执行SQL语句(转载)

Ef执行Sql查询

ASP.NET MVC5+EF6+EasyUI 后台管理系统(89)-EF执行SQL语句与存储过程

EF中使用SQL语句或存储过程

EF的增删改查(转载)

EF中执行Sql语句

EF框架使用sql语句或存储过程

转:EF调用存储过程、函数