在SqlCommand&之间混淆SqlDataAdapter的

时间:2011-10-15 12:38:47

标签: c# .net sqlcommand sqldataadapter

每个人我都是学生,不熟悉.NET,特别是MVC3开发,但对于我的项目之一,我要研究它,因此要经历学习阶段 我面临的问题和困惑是关于数据库连接问题,关于从数据库中检索记录,我感到很遗憾的是:

//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实际上有什么区别?
  • 哪种方法更好一两个?
  • 我害怕在方法二中使用可能会影响安全性或性能的快捷方式?

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

2 个答案:

答案 0 :(得分:7)

Errorstacks总结正确:

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

另外:

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

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

一点注意事项 - 由于Linq2Sql和Entity Framework,数据集和DataTables最近有点不在游戏中。
但当然欢迎普通老SqlCommands / Adapters / Readers的知识:)

答案 1 :(得分:-6)

快点行动!请注意LINQ !!!

没有像SQLDataset或TableAdapters这样的gran'ma东西,没有开放连接。 LINQ,一切都变得顺畅。

LINQ示例:

dim result =来自myDataContext.Employees中的emp     其中emp.Salary> 10000     选择emp.ID,emp.SurName,....

myDatagrid.datasource = result.toList

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

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