我一直在使用 nhibernate ORM 将数据从应用程序插入到 sql 表中。但最近我尝试在 Ado.net 上阅读并发现使用存储过程而不是 sqlcommand.executenonQuery() 的建议。
在这种情况下,每个表插入都需要不同的存储过程。一个 100 个表的应用程序将需要 100 个存储过程。我的理解是正确的还是有更好的方法以更通用的方式做到这一点?
请建议。
我一直在使用 nhibernate ORM 将数据从应用程序插入到 sql 表中。但最近我尝试在 Ado.net 上阅读并发现使用存储过程而不是 sqlcommand.executenonQuery() 的建议。
在这种情况下,每个表插入都需要不同的存储过程。一个 100 个表的应用程序将需要 100 个存储过程。我的理解是正确的还是有更好的方法以更通用的方式做到这一点?
请建议。
一个简单的单行命令可以是通过参数化的 Command 类直接在 .NET 代码中给出的 INSERT。就像是:
using (SqlConnection sqlConn = new SqlConnection(connectionString)) {
using (SqlCommand sqlCmd = new SqlCommand("INSERT INTO MyTable (Field1, Field2) VALUES (@Param1, @Param2)", sqlConn)) {
sqlCmd.Parameters.AddWithValue("@Param1", someValue1);
sqlCmd.Parameters.AddWithValue("@Param2", someValue2);
sqlConn.Open();
sqlCmd.ExecuteNonQuery();
}
}
所以它不必是每个命令的存储过程。您可以拥有一个或多个专用于 DB 访问的类(db 访问层),并使用各种方法填充它以从 DB 读取/写入。您甚至可以有一个通用方法,自动为 INSERT/UPDATE 命令派生参数。
当然,如果它超过 1-2 个命令或涉及一些逻辑 - 这要求存储过程。
顺便说一句,这是我个人的看法,但我认为 ORM 是邪恶的。
您是否听说过dapper ,这是一个执行查询并将结果映射到强类型列表的强大工具。Dapper 还支持存储过程,看看这个。
例子:
dbConnection.Query<return type>("yourSP", parameters,
commandType: CommandType.StoredProcedure).First();
还需要一些时间来检查这个SO question。
如果我有超过 5 个不同的表可供选择和/或插入,我个人会使用 ORM。如果公交车站就在门前,为什么要步行 100 英里?
也就是说,ORM是一种访问数据的通用方式。如果您想手动编写所有代码,您当然可以编写带有可选参数的存储过程,但我不推荐它。