SqlDataAdapter、存储过程和参数

Posted

技术标签:

【中文标题】SqlDataAdapter、存储过程和参数【英文标题】:SqlDataAdapter, stored procedures and parameters 【发布时间】:2014-03-11 12:21:35 【问题描述】:

我有几个关于存储过程和SqlDataAdapter 的问题:

当我运行适配器的Update 方法时,我知道它将根据表行的RowState 属性在适当的地方调用指定的INSERTUPDATEDELETE 命令。

如果将这些命令设置为存储过程,它是为表中的每一列传递具有正确值的参数,还是传递有问题的表行?

是否必须手动指定所有参数,或者适配器是否知道要传递哪些值?

是否可以在不为每列定义参数的情况下为例如 Insert 制作 sp?

如果传递表格行,sp 应该知道列名和值(或不知道)?

我实际尝试实现的是拥有一个INSERT、一个UPDATE 和一个DELETE 存储过程来处理我数据库中的所有表。在我的应用程序中我必须进行一些数据处理的地方,我会调用数据处理程序来准备必要的参数和值,然后再运行adapter.Update()

不可能、糟糕的方法还是出色的方法?

【问题讨论】:

显示您的代码到目前为止您尝试过的内容。 "have one Insert-, one Update- and one Delete-stored proc" 在我看来处理所有表格听起来是个坏主意。您打算如何以通用方法处理关系数据。我假设您将拥有特定于每个实体的业务逻辑,因此您将进入以下领域:如果是这张表,则执行此操作,如果是该表,请执行其他操作。我会把它们都分开和合乎逻辑的。 在我看来是一个糟糕的设计。一个存储过程来处理所有表的所有INSERT?祝你好运!这将是处理所有情况的一大堆代码,如果您必须添加两个、五个、二十个新表,请考虑一下维护噩梦...... . 您应该研究单一职责原则 - 每段代码都应该只做一件事 真的吗?我看不出这可能是哪些“案例”。在我的 DataHandler 中,无论数据来自哪个表,我都会按照某个标准准备数据并执行插入或更新。如果我必须为每个表存储四个存储过程(我有 150 个),我会看到一个巨大的混乱。也许我没有意识到所有的陷阱...... 【参考方案1】:

根据表中的列数,您甚至可以有一个存储过程来添加、更新或从数据库中删除。如果您有各种各样的列号,这似乎是一个坏主意。 无论如何,您可以使用动态 SQL 来传递表名,但您应该注意 SQL 注入风险,尤其是如果您的项目是 Web 应用程序。

【讨论】:

以上是关于SqlDataAdapter、存储过程和参数的主要内容,如果未能解决你的问题,请参考以下文章

带有表类型参数的存储过程返回数据但 SqlDataAdapter 不会填充

使用 ADO,使用 SqlDataAdapter.FillSchema 清除 @ReturnValues 和其他标记为输出的存储过程参数

使用一个 SqlDataAdapter 运行多个存储过程

具有临时表的存储过程的 SqlDataAdapter.FillSchema

SqlDataAdapter 未填充 DataTable

SqlDataAdapter.Fill 方法慢