在.net / c#中与ADO.AddNew()、ADO.Update()等等效的是什么



还记得ADO时代的这些吗?

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

.NET中是否存在等效的.Open.MoveNext.AddNew.Update类或组件?SQL Server数据库表逐行打开、读取和更新的标准方式是什么?

目前,我使用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+中创建项目的人使用实体框架核心,简单的方法(如果你有一个现有的数据库)可以是:

  • 安装EF core电动工具扩展(无隶属关系)
  • 对现有的数据库进行反向工程,以获得一个上下文和一组代表数据库表的类(实例代表行),它们之间的导航属性表示关系
  • 写:

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过于重量级,无法满足支持stackoverflow的数据访问需求,于是创建了Dapper,它有点像EF的对象映射部分,但更轻量,可以让你掌握SQL(但你必须自己管理数据之间的关系);它为你运行查询和读取/创建对象的实例:

//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,这样我就可以准确地控制db做什么";但是"让我从向命令中添加参数,或者从读取器中提取数据并将其放入对象属性的乏味中解脱出来。-在一个完整的ORM和创建DbCommand实例之间的一种折衷方法

有很多其他库的目标是做类似于EFC/Dapper的事情;我不会把它们全部列出,也不会在这里背书或推荐任何你可能找到的东西。谷歌搜索"x alternative";如果你想探索这些流行别针的替代品,将开始你。

这个答案也不打算成为一个"这正是你应该做的"。也不是"这是最佳实践";(虽然希望大部分是合理的;如果可能的话我会选择异步)这只是一个从"我们当时是怎么做事情的"到"我们现在可能会怎么做事情"的过程的例子

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

最新更新