博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
程序中处理一对多的数据
阅读量:6911 次
发布时间:2019-06-27

本文共 4411 字,大约阅读时间需要 14 分钟。

开发过程中,Insus.NET经常性遇上一对多的数据关系,并需要存入数据中。就以下图为例,一个拉号可以对应多台机器。下图有三个铵钮,分别为[分配机器], [取消分配]和[查看分配]。

 

 

想存储这些分配数据,需要在数据库创建一个表存储。

ExpandedBlockStart.gif
LaHaoJiQi
SET ANSI_NULLS 
ON
GO
SET QUOTED_IDENTIFIER 
ON
GO
--
 =============================================
--
 Author:        Insus.NET
--
 Create date: 2012-09-13
--
 Description:    存储拉号与机器分配记录
--
 =============================================
CREATE 
TABLE 
[
dbo
].
[
LaHaoJiQi
](
    
[
LaHaoId
] 
[
tinyint
] 
NULL,
    
[
JiQi_nbr
] 
[
smallint
] 
NULL,
    
[
IsEnable
] 
[
bit
] 
NULL
ON 
[
PRIMARY
]
GO

 

写一个存储过程,处理分配与取消分配,数据记录插入与更新,存储过程代码示例,有详细备注。

ExpandedBlockStart.gif
usp_LaHaoJiQi_Distribution
SET ANSI_NULLS 
ON
GO
SET QUOTED_IDENTIFIER 
ON
GO
--
 =============================================
--
 Author:        Insus.NET
--
 Create date: 2012-09-13
--
 Description:    拉号与机器分配或取消
--
 =============================================
ALTER 
PROCEDURE 
[
dbo
].
[
usp_LaHaoJiQi_Distribution
]
(
    
@LaHaoId 
TINYINT,  
--
用户选择的拉号(只有一个)
    
@jIqiCollections 
NVARCHAR(
MAX), 
--
选择的机器,有可能多台机器,前台处理的结果,如1,4,7,9,12
    
@IsEnable 
BIT  
--
告诉系统,是分配还是取消分配,如果值为1是分配,那0为取消分配。
)
AS
--
创建一个临时表,用来存储选择的机器。
IF 
OBJECT_ID (
'
#jq
'
IS 
NOT 
NULL
    
DROP 
TABLE #jq
CREATE 
TABLE #jq
(
    
[
ID
] 
INT,
    
[
JiQi_nbr
] 
SMALLINT
)
--
把字符串的机器拆分,然后插入刚才创建的临时表中,下面有一个函数,可以参考URL链接。
--
INSERT 
INTO #jq 
SELECT 
[
ID
],
[
KeyWord
] 
FROM 
[
dbo
].
[
udf_SplitStringToTable
](
@jIqiCollections,
'
,
')
DECLARE 
@r 
INT 
= 
1,
@r1 
INT
SELECT 
@r1 
= 
MAX(
[
ID
]
FROM #jq  
--
获取最大的记录ID,将为下面的记录循环准备
WHILE 
@r 
<= 
@r1  
--
开始循环
BEGIN
    
DECLARE 
@JiQi_nbr 
SMALLINT
    
IF 
EXISTS (
SELECT 
TOP 
1 
1 
FROM #jq 
WHERE 
[
ID
] 
= 
@r)
    
BEGIN
        
--
获取机器ID
        
SELECT 
@JiQi_nbr 
= 
[
JiQi_nbr
] 
FROM #jq 
WHERE 
[
ID
] 
= 
@r
        
        
IF 
@IsEnable 
= 
1  
--
是分配动作
        
BEGIN
            
            
--
如果此机器已经存在分配表中。
            
IF 
EXISTS (
SELECT 
TOP 
1 
1 
FROM 
[
dbo
].
[
LaHaoJiQi
] 
WHERE 
[
JiQi_nbr
] 
= 
@JiQi_nbr)    
            
BEGIN
                
--
判断此机器是否已经被分配。IsEnable为1是分配,为0没有被分配。
                
IF 
EXISTS (
SELECT 
TOP 
1 
1 
FROM  
[
dbo
].
[
LaHaoJiQi
] 
WHERE 
[
JiQi_nbr
] 
= 
@JiQi_nbr 
AND 
[
IsEnable
] 
= 
0)
                    
--
更新拉号和分配状态
                    
UPDATE 
[
dbo
].
[
LaHaoJiQi
] 
SET 
[
LaHaoId
] 
= 
@LaHaoId,
[
IsEnable
] 
= 
@IsEnable 
WHERE 
[
JiQi_nbr
] 
= 
@JiQi_nbr 
                
ELSE
                    
--
如果已经被分配,只更新IsEnable的值,变为分配。
                    
UPDATE 
[
dbo
].
[
LaHaoJiQi
] 
SET 
[
IsEnable
] 
= 
@IsEnable 
WHERE 
[
JiQi_nbr
] 
= 
@JiQi_nbr 
            
END                
            
ELSE  
--
如果此机器不存在分配表中,把记录插入表中。
                
INSERT 
INTO 
[
dbo
].
[
LaHaoJiQi
] (
[
LaHaoId
],
[
JiQi_nbr
],
[
IsEnable
])  
VALUES (
@LaHaoId,
@JiQi_nbr,
@IsEnable)
        
END
        
--
取消分配动作
        
IF  
@IsEnable 
= 
0 
AND 
EXISTS (
SELECT 
TOP 
1 
1 
FROM  
[
dbo
].
[
LaHaoJiQi
] 
WHERE 
[
LaHaoId
] 
= 
@LaHaoId 
AND 
[
JiQi_nbr
] 
= 
@JiQi_nbr 
AND 
[
IsEnable
] 
= 
1)            
            
UPDATE 
[
dbo
].
[
LaHaoJiQi
] 
SET 
[
IsEnable
] 
= 
@IsEnable 
WHERE 
[
JiQi_nbr
] 
= 
@JiQi_nbr     
    
END
    
SET 
@r 
= 
@r 
+ 
1  
END    
--
结束循环

 

处理前与数据库之间传输,也就是逻辑层的方法:

ExpandedBlockStart.gif
View Code
 
public 
void DistributionJiQi()
        { 
            Parameter[] parameter = { 
                                    
new Parameter (
"
@LaHaoId
",SqlDbType.TinyInt,
1,_LaHaoId),
                                    
new Parameter (
"
@jIqiCollections
",SqlDbType.NVarChar,-
1,_JiQiCollections),      
                                    
new Parameter (
"
@IsEnable
",SqlDbType.Bit,
1,_IsEnable)
                                    };
            objBusinessBase.ExecuteProcedure(
"
usp_LaHaoJiQi_Distribution
", parameter); 
        }    

 

然后,在页面中,两个铵钮事件,两个铵钮事件写法其本一样,只是稍微不一样。

ExpandedBlockStart.gif
View Code
 
//
分配动作
    
protected 
void ButtonDistributionJiQi_Click(
object sender, EventArgs e)
    {
        
string jqPrimarykey = GetCheckBoxListSelectedValue(
this.CheckBoxListJiQi);
        
try
        {
            objLaHaoJiQi.LaHaoId = ConvertData.ToByte(
this.RadioButtonListLaHao.SelectedItem.Value);
            objLaHaoJiQi.JiQiCollections = jqPrimarykey;
            objLaHaoJiQi.IsEnable = 
true
//
设为true
            objLaHaoJiQi.DistributionJiQi();
            Data_Binding();          
            objInsusJsUtility.JsAlert(
"
机器成功分配。
");
        }
        
catch (Exception ex)
        {
            objInsusJsUtility.JsAlert(ex.Message);
        }
    }
    
//
取消分配动作
    
protected 
void ButtonCancelDistributionJiQi_Click(
object sender, EventArgs e)
    {    
        
string jqPrimarykey = GetCheckBoxListSelectedValue(
this.CheckBoxListJiQi);
        
try
        {
            objLaHaoJiQi.LaHaoId = ConvertData.ToByte(
this.RadioButtonListLaHao.SelectedItem.Value);
            objLaHaoJiQi.JiQiCollections = jqPrimarykey;
            objLaHaoJiQi.IsEnable = 
false;
//
设为false
            objLaHaoJiQi.DistributionJiQi();
            Data_Binding();        
            objInsusJsUtility.JsAlert(
"
机器成功取消分配。
");
        }
        
catch (Exception ex)
        {
            objInsusJsUtility.JsAlert(ex.Message);
        }
    }

 

细心的用户,也许会发现上面的代码,一个方法GetCheckBoxListSelectedValue(),就是获取CheckBoxList的选择选项的值。它的代码是这样子的:

ExpandedBlockStart.gif
View Code
 
protected 
string GetCheckBoxListSelectedValue(CheckBoxList checkBoxList)
        {
            
string selectedValue = 
string.Empty;
            
foreach (ListItem li 
in checkBoxList.Items)
            {
                
if (li.Selected)
                {
                    selectedValue = selectedValue + 
"
,
" + li.Value;
                }
            }
            
if (selectedValue.Length > 
0)
            {
                selectedValue = selectedValue.Substring(
1);
            }
            
return selectedValue;
        }

 

 

转载地址:http://ztycl.baihongyu.com/

你可能感兴趣的文章
centos FTP服务器的架设和配置
查看>>
深度:ARC会导致的内存泄露
查看>>
【Android】第18章 位置服务和手机定位—本章示例主界面
查看>>
如何让 protected internal 跨程序集!
查看>>
结对编程作业总结2
查看>>
2018-2019-1 20165231 《信息安全系统设计基础》第七周学习总结
查看>>
转 10 个最佳的 Node.js 的 MVC 框架
查看>>
Linux学习笔记(六)-Linux服务程序的安装和卸载
查看>>
转 @JoinColumn 详解
查看>>
mysql 主从复制
查看>>
详解C/C++预处理器
查看>>
阿里云OSS图片上传plupload.js结合jq-weui 图片上传的插件
查看>>
随机产生id字符串
查看>>
(十七)SpringBoot之使用异步消息服务jms之ActiveMQ
查看>>
第19讲 | 上手搭建一条自己的智能合约
查看>>
Matlab绘制空间几何图
查看>>
在Node.js上搭建React.js开发环境
查看>>
常州大学新生寒假训练会试 题解
查看>>
ASCII,Unicode和UTF-8
查看>>
性能指标术语&理发店模型
查看>>