如何直接执行SQL语句

如题所述

  1、ExecuteQuery方法

  看命名,我们很容易联想到ADO.NET里熟悉的Command的ExecuteNonQuery方法,但是VS的智能提示告诉我们这个方法返回的是一个泛型集合,应该“所思非所得”。下面通过一个简单方法,验证我们的猜想(数据库设计可以参考这一篇):

  /// <summary>
  /// 直接执行sql语句,获取总人数
  /// </summary>
  /// <returns></returns>
  publicint GetTotalCount()
  {
  string strSql = "SELECT COUNT(0) FROM Person(NOLOCK)";
   var query = dataContext.ExecuteQuery<int>(strSql);
  int result = query.First<int>();
  Console.WriteLine();
  Console.WriteLine("total count:{0}", result);
  return result;
  }

  调试的时候,通过IntelliTrace跟踪到:

  毫无疑问,上面的图片说明最初的想法是不正确的,”ADO.NET:执行Reader…”云云,让我们更加坚信它实际执行的应该是ExecuteReader方法。当然最简单的方法是直接查看它的方法说明:

  // 摘要:
  // 直接对数据库执行 SQL 查询并返回对象。
  //
  // 参数:
  // query:
  // 要执行的 SQL 查询。
  //
  // parameters:
  // 要传递给命令的参数数组。注意下面的行为:如果数组中的对象的数目小于命令字符串中已标识的最大数,
  则会引发异常。如果数组包含未在命令字符串中引用的对象,则不会引发异常。如果某参数为
  // null,则该参数会转换为 DBNull.Value。
  //
  // 类型参数:
  // TResult:
  // 返回的集合中的元素的类型。
  //
  // 返回结果:
  // 由查询返回的对象的集合。
  public IEnumerable<TResult> ExecuteQuery<TResult>(string query, paramsobject[] parameters);

  ExecuteQuery方法还有一个非泛型方法:

  //
  // 摘要:
  // 直接对数据库执行 SQL 查询。
  //
  // 参数:
  // elementType:
  //

  要返回的 System.Collections.Generic.IEnumerable<T>
的类型。使查询结果中的列与对象中的字段或属性相匹配的算法如下所示:如果字段或属性映射到特定列名称,则结果集中应包含该列名称。如果未映射字段或属性,则结果集中应包含其名称与该字段或属性相同的列。通过先查找区分大小写的匹配来执行比较。如果未找到匹配项,则会继续搜索不区分大小写的匹配项。如果同时满足下列所有条件,则该查询应当返回(除延迟加载的对象外的)对象的所有跟踪的字段和属性:T

  // 是由 System.Data.Linq.DataContext 显式跟踪的实体。
  System.Data.Linq.DataContext.ObjectTrackingEnabled
  // 为 true。实体具有主键。否则会引发异常。
  //
  // query:
  // 要执行的 SQL 查询。
  //
  // parameters:
  // 要传递给命令的参数数组。注意下面的行为:如果数组中的对象的数目小于命令字符串中已标识的最大数,
  则会引发异常。如果数组包含未在命令字符串中引用的对象,则不会引发异常。如果某参数为
  // null,则该参数会转换为 DBNull.Value。
  //
  // 返回结果:
  // 由查询返回的对象的 System.Collections.Generic.IEnumerable<T> 集合。
  public IEnumerable ExecuteQuery(Type elementType, string query, paramsobject[] parameters);

  看它的参数需要多传递一个elementType,明显不如泛型方法简洁。

  2、ExecuteCommand方法

  同样道理,这个方法立刻让我们联想到(世界没有联想,生活将会怎样?),联想到,等等,不知联想到什么。然后我们看一下方法使用说明:

  //
  // 摘要:
  // 直接对数据库执行 SQL 命令。
  //
  // 参数:
  // command:
  // 要执行的 SQL 命令。
  //
  // parameters:
  // 要传递给命令的参数数组。注意下面的行为:如果数组中的对象的数目小于命令字符串中已标识的最大数,
  则会引发异常。如果数组包含未在命令字符串中引用的对象,则不会引发异常。如果任一参数为
  // null,则该参数会转换为 DBNull.Value。
  //
  // 返回结果:
  // 一个 int,表示所执行命令修改的行数。
  publicint ExecuteCommand(string command, paramsobject[] parameters);

  到这里,看它的返回类型为int,表示执行命令修改的行数,这次很容易想到ExecuteNonQuery方法。对不对呢?通过下面的代码证明我们的设想:

  /// <summary>
  /// 直接执行sql语句 根据用户Id更新体重
  /// </summary>
  /// <param name="id">用户Id</param>
  /// <param name="destWeight">更新后的体重</param>
  /// <returns></returns>
  publicint ModifyWeightById(int id, double destWeight)
  {
  string strSql = string.Format("UPDATE Person SET Weight={0} WHERE Id={1}", destWeight, id);
  int result = dataContext.ExecuteCommand(strSql);
   Console.WriteLine();
  Console.WriteLine("affect num:{0}", result);
  return result;
  }

  调试过程中,通过IntelliTrace可以很清楚地捕获:

  

  “ADO.NET:执行NonQuery…”基本可以断言我们的设想是正确的。

  3、防止sql注入

  1和2中,执行sql语句的两个方法都有一个params 类型的参数,我们又会想到ADO.NET非常重要的sql语句的参数化防止sql注入问题。下面通过一个方法,看看linq2sql可不可以防止sql注入。

  (1)、直接执行拼接的sql语句(有风险)

  /// <summary>
  /// 直接执行sql语句 根据用户Id更新FirstName
  /// </summary>
  /// <param name="id">用户Id</param>
  /// <param name="destName">更新后的FirstName</param>
  /// <returns></returns>
  publicint ModifyNameById(int id, string destName)
  {
  string strSql = string.Format("UPDATE Person SET FirstName='{0}' WHERE Id={1}", destName, id);
  //这么拼接有风险
  int result = dataContext.ExecuteCommand(strSql);
  Console.WriteLine();
  Console.WriteLine("affect num:{0}", result);
  return result;
   }

  然后,在客户端这样调用这个方法:

  int result = ServiceFactory.CreatePersonService().ModifyNameById(10, "'Anders'");
  //更新id为10的人的FirstName
温馨提示:内容为网友见解,仅供参考
无其他回答

如何直接执行SQL语句
SQL不能直接执行,只能发送给数据库系统(软件)进行执行。在安装完数据库后,多数数据库系统会提供管理应用工具,比如SQL Server会提供“企业管理器”或“SQL Server Management Studio”,起动它,联接SQL Server后,可以在相关的界面中输入SQL语句进行执行。相关知识:SQL语句是一种文本语言,用于对数据库...

在access中执行sql语句的步骤
1、点击【创建】-【查询设计】。2、直接关闭弹出的【显示表】。3、找到【SQL视图】。4、在查询命令窗口输入命令,然后执行运行命令。5、之后会出现提示语句。6、最后SQL命令添加记录成功!

怎么执行sql命令?
1、点击页面中的【SQL】。2、打开之后在右侧就会出现一个空白的区域。输入所需的SQL命令。3、SQL语句输入完整之后,在空白区域 ,点击右键选择执行。以上就是执行sql命令的步骤。

一条sql查询语句是如何执行的?
首先,连接器环节:在 Linux 操作系统中,连接 MySQL 服务后才能执行 SQL 语句。连接建立过程中,TCP 三次握手确保传输安全,若 MySQL 服务未启动,将提示连接失败。连接器验证用户名和密码,确保安全,权限管理贯穿连接始终。通过 show processlist 命令可查看当前连接状态。空闲连接遵循 wait_timeout 参数...

轻松掌握mysql中运行sql语句的方法与技巧mysql下运行sql
MySQL中的SQL语句可以通过以下方法来运行:1.打开MySQL命令行客户端,使用mysql命令。2.在MySQL的服务器上运行命令行工具或图形用户界面(GUI)。3.使用PHP、Perl、Python、Java或其他编程语言建立一个连接以执行SQL查询。下面以打开MySQL命令行客户端并使用mysql命令为例:需要打开MySQL命令行客户端,这可以...

一条sql是如何执行的
长连接和短连接是两种不同的连接方式,长连接在客户端持续有请求时使用同一个连接,而短连接在执行少量查询后会断开连接。查询缓存(在mysql8.0中已移除)是连接器工作完成后,客户端向MySQL服务发送SQL语句时,MySQL服务会先查询缓存是否已有该命令的结果。如果命中查询缓存,则直接返回结果;否则,执行...

怎么在页面直接执行SQL语句???
怎么在页面直接执行SQL语句???在你安装完sql 2000 之后 开始->所有程序->Microsoft Sql Server->查询分析器 输入相应的数据库名称(如果忘了 可以进入 开始->所有程序->Microsoft Sql Server->服务器管理查看) 用户名 密码就可以进入 在这里可以进行sql语言的编译 和 执行 ...

直接执行SQL语句的快捷键是什么啊?谢谢!
鼠标选中要执行的代码,再按组合件:Alt+x

SQL语句执行过程详解
会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果在数据高速缓存中,则服务器进程就会直接执行这个 SQL 语句,省去后续的工作。所以,采用高速数据缓存的话,可以提高 SQL 语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面,也是...

MySQL中执行SQL的流程
SQL语句被解析器解析,它将复杂的SQL语句拆解为查询目标(如从users表中获取id=1的数据)、字段选择等操作。接下来,查询优化器根据这些信息选择执行的最优路径,比如直接定位数据或先全表查询再筛选。存储引擎作为核心组件,根据执行器调用的执行计划,执行具体的数据库操作,如读取内存缓存或磁盘数据,更新...

相似回答