【发布时间】:2019-01-03 21:44:34
【问题描述】:
我有一个CheckBoxes 的列表:
List<CheckBox> checkBoxes = new List<CheckBox>();
我想通过存储过程更新它,所以我有:
private void btnSave_Click(object sender, EventArgs e)
{
SQLConnMgr db = new SQLConnMgr();
foreach (var c in checkBoxes)
{
db.ExeSQL($"exec test @CheckBoxName = {c.Name}, @CheckBoxValue = {c.Checked} ");
}
}
存储过程:
CREATE OR ALTER PROCEDURE test
-- Add the parameters for the stored procedure here
@CheckBoxName VARCHAR(255),
@CheckBoxValue BIT
AS
BEGIN
SET NOCOUNT ON;
-- Insert statements for procedure here
UPDATE MyTable SET @CheckBoxName = @CheckBoxValue
END
我的问题是:还有其他方法可以做到这一点吗?喜欢在 foreach 声明中发送多个请愿书,而不是一次只发送一个?
更新
所以为了更清楚,每个 bool 都是一列,所以我需要类似:
DECLARE @CurrentCheckboxName VARCHAR(255) = (SELECT
[CheckBoxName]
FROM @CheckBoxList)
UPDATE [m]
SET
@CurrentCheckboxName = [c].[CheckBoxValue]
FROM [RedMarkItems] [m]
JOIN @CheckBoxList [c] ON [c].[CheckBoxName] = @CurrentCheckboxName
但是如何迭代我的 DECLARE 中的每个 checkboxName?
【问题讨论】:
-
也许您可以尝试连接 SQL 语句?顺便说一句,您的 SQL 语言是什么? MySQL?甲骨文?还是什么?
-
对不起,我正在使用 Sql 服务器管理 TSQL @Smankusors
-
您可以在存储过程中使用 UDT 作为参数,并发送关于 UDT 的数据
-
从技术上讲它可以工作,但从架构的角度来看,这不是一个好的解决方案,因为您将 GUI 前端粘合到数据库中!您的数据库不应依赖于任何前端 gui 元素名称。我会为复选框的含义使用逻辑唯一 ID,并在数据库中使用该 ID,这样数据库就不会依赖于任何 GUI 元素。
-
你的意思是把
exec test放在你有exec MyTable的地方吗?除非您还有一个未在此处显示的MyTable存储过程,否则当前形式的示例代码将无法工作...