11

每个人我都是学生,是 .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 之间实际上有什么区别?
  • 哪种方法更好一或二?
  • 是否担心我在方法二中使用了可能会影响安全性或性能的快捷方式?

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

4

2 回答 2

10

Errorstacks 总结得对:

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

此外:

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

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

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

于 2011-10-15T20:22:08.087 回答
-6

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

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

LINQ 示例:

dim result = from emp in myDataContext.Employees where emp.Salary > 10000 Select emp.ID, emp.SurName, ....

myDatagrid.datasource = 结果.toList

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

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

于 2011-10-15T21:11:19.767 回答