【问题标题】:Confused between SqlCommand & SqlDataAdapter在 SqlCommand 和 SqlDataAdapter 之间混淆
【发布时间】:2011-12-08 08:05:24
【问题描述】:

每个人我都是学生,刚接触 .NET,特别是 MVC3 开发,但对于我的一个项目,我必须完成它,因此要经历学习阶段 我面临的问题和困惑是关于 DB-Connectivity,关于从数据库中检索记录,我所了解的内容是这样的:

//Method One:
var conn = new SqlConnection(conString.ConnectionString);
const string cmdString = "Select * FROM table";
var cmd = new SqlCommand(cmdString, conn); 
var mySqlDataAdapter = new SqlDataAdapter(cmd);
mySqlDataAdapter = new SqlDataAdapter(cmd);
mySqlDataAdapter.Fill(myDataSet, "design");
// making a new SqlCommand object with stringQuery and SqlConnection object THEN a new SqlDataAdapter object with SqlCommand object and THEN filling up the table with the resulting dataset.

但是,当我检查MSDN Library 时,我发现 SqlDataAdapter 提供了一个构造函数 SqlDataAdapter(String, String),它直接接受一个 SelectCommand 和一个连接字符串来启动,因此跳过了 SqlCommand 之间的角色,如下所示:

//Method Two:
var conn = new SqlConnection(conString.ConnectionString);
const string cmdString = "Select * FROM table";
var mySqlDataAdapter = new SqlDataAdapter(cmdString, conn);
mySqlDataAdapter.Fill(myDataSet, "design");

对我来说看起来又短又漂亮,但我在这里很困惑,如果这可以通过这种方式实现,那么为什么大多数书籍/教师都会更早地通过(SqlCommand 的方式)。

  • SqlCommand 和 SqlDataAdapter 之间究竟有什么区别?
  • 一或二哪种方法更好?
  • 是否担心我在方法二中使用了可能会影响安全性或性能的快捷方式?

如果我听起来很新手或模糊不清,请提前道歉!将不胜感激任何可以清除我的概念的帮助!谢谢! :)

【问题讨论】:

    标签: c# .net sqlcommand sqldataadapter


    【解决方案1】:

    Errorstacks 总结得对:

    • SqlAdapter 用于填充数据集。
    • SqlCommand 可用于您想到的与创建/读取/更新/删除操作、存储过程执行等相关的任何目的。

    另外:

    • SqlCommand 在安全性方面相对于使用原始字符串有一大优势 - 它们可以保护您免受 Sql 注入。只需对用户提供的值使用参数,而不是 string.Format(...)。

    我个人的偏好是在 SqlCommand 中包装任何 sql 字符串并为其添加 SqlParameters 以避免恶意用户的 Sql Injection。
    关于这两种方法的性能 - 我不希望有任何区别。 (如果有人能证明我错了 - 那就去做吧!)。
    因此,我建议坚持使用较长的变体 1,并在必要时使用命令和参数。

    附带说明 - 由于 Linq2Sql 和实体框架,数据集和数据表最近有点出局了。
    但是当然欢迎普通旧 SqlCommands/Adapters/Readers 的知识:)

    【讨论】:

      【解决方案2】:

      快点!把你的注意力转向LINQ!!!

      没有更多像 SQLDataset 或 TableAdapters 之类的东西,没有打开的连接。 使用 LINQ,一切都变得更加顺畅。

      LINQ 示例:

      dim 结果 = 来自 myDataContext.Employees 中的 emp 其中emp.Salary > 10000 选择emp.ID、emp.SurName、....

      myDatagrid.datasource = result.toList

      使用 LINQ,您不必担心查询中的单引号或 crlf...

      您甚至可以对 SQL 表、列和对象进行智能感知!

      【讨论】:

      • 那没有回答问题。此外,有时 LINQ 不可用。例如,它在 3.5 之前的 .NET CE 版本中不可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 2015-06-01
      • 2020-01-08
      • 2012-10-21
      • 2011-09-22
      • 2013-01-03
      相关资源
      最近更新 更多