什么 .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.SqlClient
和 SqlCommand.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 之后我们如何做事”的进展到“我们现在可能如何做事”
我与提到的任何软件都没有任何关系
还记得 ADO 时代的这些吗?
rs.movenext()
rs.addnew()
rs.update()
.NET 中是否有等效的 .Open
、.MoveNext
、.AddNew
和 .Update
class 或组件?逐行打开、读取和更新 SQL 服务器数据库表的当前标准方法是什么?
目前,我使用 Microsoft.Data.SqlClient
和 SqlCommand.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 之后我们如何做事”的进展到“我们现在可能如何做事”
我与提到的任何软件都没有任何关系