还记得ADO时代的这些吗?
rs.movenext()
rs.addnew()
rs.update()
.NET中是否存在等效的.Open
、.MoveNext
、.AddNew
和.Update
类或组件?SQL Server数据库表逐行打开、读取和更新的标准方式是什么?
目前,我使用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+中创建项目的人使用实体框架核心,简单的方法(如果你有一个现有的数据库)可以是:
- 安装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";如果你想探索这些流行别针的替代品,将开始你。
这个答案也不打算成为一个"这正是你应该做的"。也不是"这是最佳实践";(虽然希望大部分是合理的;如果可能的话我会选择异步)这只是一个从"我们当时是怎么做事情的"到"我们现在可能会怎么做事情"的过程的例子
我与提到的任何软件都没有关系