SqlDataAdapter、存储过程和参数
Posted
技术标签:
【中文标题】SqlDataAdapter、存储过程和参数【英文标题】:SqlDataAdapter, stored procedures and parameters 【发布时间】:2014-03-11 12:21:35 【问题描述】:我有几个关于存储过程和SqlDataAdapter
的问题:
当我运行适配器的Update
方法时,我知道它将根据表行的RowState
属性在适当的地方调用指定的INSERT
、UPDATE
和DELETE
命令。
如果将这些命令设置为存储过程,它是为表中的每一列传递具有正确值的参数,还是传递有问题的表行?
是否必须手动指定所有参数,或者适配器是否知道要传递哪些值?
是否可以在不为每列定义参数的情况下为例如 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 和其他标记为输出的存储过程参数