存储过程仅影响当前聚焦的行
Posted
技术标签:
【中文标题】存储过程仅影响当前聚焦的行【英文标题】:Having a stored procedure affect only the currently focused row 【发布时间】:2021-09-08 20:37:52 【问题描述】:我正在将 Visual Studio 与 DevExpress Winforms 与 Microsoft SQL Server Manager 结合使用,我目前正在尝试编写一个存储过程,该过程将在单击按钮时激活,将焦点行复制到另一个表中。
我已经对其进行了研究,但无法找到满足我需要的解决方案。如果可能的话,我宁愿不使用复选框,但我对此持开放态度。
我当前在存储过程中的代码是:
CREATE PROCEDURE [dbo].[procedurename]
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT * FROM tbl_b)
INSERT INTO tbl_b (column names here)
SELECT DISTINCT (column names here)
FROM tbl_a
END
在使用按钮测试程序时,我已经能够成功调用此过程,并且它的功能大部分符合预期,将数据从一个表移动到另一个表而没有重复,但是当我只移动整个表时想要移动焦点所在的行。
我为此使用了 gridView,并且我尝试了使用 DataGridView 的解决方案,但似乎不起作用。
这是一个基于桌面的程序。
【问题讨论】:
很高兴听到“这是一个基于桌面的程序。”,但如果您需要“我只想移动焦点行”,您应该通知存储过程有关焦点行,例如添加 SELECT DISTINCT(此处为列名) FROM tbl_a where the_focused_row=..... 【参考方案1】:您的存储过程中需要一个参数来保存您要复制的行的标识
CREATE PROCEDURE [dbo].[procedurename] (@ID int)
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT * FROM tbl_b)
INSERT INTO tbl_b (column names here)
SELECT DISTINCT (column names here)
FROM tbl_a
where tbl_A.PrimaryKeyColumn = @ID
END
在按钮的 Click 事件中,您可以执行类似的操作
var id = myGridView.GetRowCellValue(myGridView.FocusedRowHandle, "YourPrimaryKeyName");
现在你可以使用这个id
变量来传递给你的存储过程
但是,您的存储过程中确实存在另一个问题
IF NOT EXISTS (SELECT * FROM tbl_b)
一旦该表中有 1 行或更多行,此检查将永远不允许您执行插入操作。
我认为你需要类似的东西
IF NOT EXISTS (SELECT 1 FROM tbl_b where tbl_b.PrimaryKey = @ID)
【讨论】:
谢谢,这真的很有帮助。但是我遇到了一个问题,当我按照方法传递参数时,我继续得到一个 SQL 异常,它说我没有传递参数。你有什么建议吗? 没有更多信息我只能猜测。我建议您在 SO 上创建一个新问题,并将程序代码和您如何调用该程序的代码放在那里。还要把确切的错误信息放在那里 它说我已经达到一个明显的问题限制,即使我今天只问了一个问题,你知道任何解决方法吗? 您能否编辑您的问题以包含调用存储过程并设置参数的代码?以上是关于存储过程仅影响当前聚焦的行的主要内容,如果未能解决你的问题,请参考以下文章