【发布时间】:2013-06-15 11:24:49
【问题描述】:
我一直在使用 nhibernate ORM 将数据从应用程序插入到 sql 表中。 但最近我尝试在 Ado.net 上阅读,发现建议使用存储过程而不是 sqlcommand.executenonQuery().
在这种情况下,每个表插入都需要不同的存储过程。一个 100 个表的应用程序将需要 100 个存储过程。我的理解正确还是有更好的方法以更通用的方式进行?
请提出建议。
【问题讨论】:
标签: ado.net
我一直在使用 nhibernate ORM 将数据从应用程序插入到 sql 表中。 但最近我尝试在 Ado.net 上阅读,发现建议使用存储过程而不是 sqlcommand.executenonQuery().
在这种情况下,每个表插入都需要不同的存储过程。一个 100 个表的应用程序将需要 100 个存储过程。我的理解正确还是有更好的方法以更通用的方式进行?
请提出建议。
【问题讨论】:
标签: ado.net
一个简单的单行命令可以是通过参数化的 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 还支持存储过程,请查看this。
示例:
dbConnection.Query<return type>("yourSP", parameters,
commandType: CommandType.StoredProcedure).First();
还需要一些时间来检查这个SO question。
【讨论】:
如果我有超过 5 个不同的表可供选择和/或插入,我个人会使用 ORM。如果公交车站就在门前,为什么要步行 100 英里?
也就是说,ORM 是一种访问数据的通用方式。如果您想手动编写所有代码,您当然可以编写带有可选参数的存储过程,但我不推荐它。
【讨论】: