什么 .NET / C# 相当于 ADO.AddNew()、ADO.Update() 等

What .NET / C# equivalent to ADO.AddNew(), ADO.Update(), etc

还记得 ADO 时代的这些吗?

rs.movenext()
rs.addnew()
rs.update()

.NET 中是否有等效的 .Open.MoveNext.AddNew.Update class 或组件?逐行打开、读取和更新 SQL 服务器数据库表的当前标准方法是什么?

目前,我使用 Microsoft.Data.SqlClientSqlCommand.ExecuteNonQuery() 来发出 INSERT/UPDATE 和 DELETE 语句。

这就是可行的方法,还是有更新的方法?

同意所有评论。要回答您的问题,最接近的可能是 DataReader 和手动更新;

using var c = new SqlCommand("SELECT * FROM person", "connstr here");
using var u = new SqlCommand("UPDATE person SET Name = @n WHERE ID = @i", "connstr here");
u.Parameters.Add("@n", SqlDbType.Int);
u.Parameters.Add("@i", SqlDbType.VarChar, 30);
c.Connection.Open();
u.Connection.Open();
var r = c.ExecuteReader();
while(r.Read()){
  var id = r.GetInt32(0));
  var name = r.GetString(1);
  u.Parameters["@n"] = name+"Hello";
  u.Parameters["@i"] = id;
  u.ExecuteNonQuery();
}

呃。

DataTables 变得更好:

var da = new SqlDataAdapter("SELECT * FROM Person");
var cb = new SqlCommandBuilder(da);
var dt = new DataTable();
da.Fill(dt);
foreach(DataRow r in dt.Rows)
  r["Name"] = r["Name"].ToString()+"Hello";
da.UpdateCommand = cb.GetUpdateCommand();
da.Update(dt);

呃。

并且强类型数据表变得更好:

var t = new PersonTableAdapter();
var dt = t.GetData(); //the sql is hidden inside the tabkeadapter and is configured in a nice visual designer 
foreach(var person in dt)
  person.Name+="Hello";
t.Update(dt);

但即使这些现在都是古老的技术,尽管它们仍然可以很好地与 WinForms 一起工作,但在 netcore+ 中却不行

快进 EF 和其他类似 ORM 的迭代,可以公平地说,大多数在 netcore+ 中创建项目的人都使用 entity framework core,这是一种简单的方法(如果您有现有的分贝)可以是:

  • 安装 EF core power tools 扩展(无从属关系)
  • 对您现有的数据库进行逆向工程以获取上下文和一组 类 代表数据库表(实例代表行),它们之间的导航属性代表关系
  • 写入:

    var people = dbContext.People; //you'd use LINQ to do where clauses etc here
    foreach(var person in people)
      person.Name+="Hello";
    
    dbContext.SaveChanges();

(实际上您可能会使用异步版本,但为了简洁起见,我将其省略)

另外值得一提的是,Sam Saffron 和 Marc Gravell 厌倦了 EF 过于重量级,无法满足支持 Whosebug 的数据访问需求的需求,并创建了 Dapper,它有点像 EF 的对象映射部分,但重量更轻,给你动手 SQL(但你必须自己管理数据之间的关系);它为您运行查询和 reads/creates 个对象实例:

//class Person with int Id, string Name properties somewhere 

    ...

    using var c = new SqlConnection("conn str here");
    var people = c.Query<Person>("SELECT * FROM people"); //the property names of Person match the table column names exactly
    foreach(var p in people){
      p.Name += "Hello";
      c.Execute("UPDATE person SET Name = @Name WHERE ID = @Id", p); //the parameter names exactly match the c# property names
    }

人们喜欢它,因为它融合了“让我可以访问原始 sql,这样我就可以准确地控制数据库的功能”,但“让我从向命令添加参数或拉取参数的单调乏味中解脱出来”读取器中的数据并将其放入对象属性中”——一种介于完整 ORM 和创建 DbCommand 实例之间的折衷办法

还有许多其他库旨在做与 EFC/Dapper 类似的事情;我不会将它们全部列出,也不会认可或推荐这里的任何内容,而不是您可能会发现的任何其他内容。 Google 如果您想探索提到的这些流行别针的替代品,搜索“x alternative”会让您开始。

这个答案也不是要成为“这正是你的做法”,也不是“这是最佳实践”(尽管希望大部分是合理的;我会尽可能异步)它只是一个例子“在 ADORS 之后我们如何做事”的进展到“我们现在可能如何做事”

我与提到的任何软件都没有任何关系