周末空闲 想请高人来讨论个问题

子夜__ 2011-03-26 10:11:00
晚上看了电视没事做 YY了一个问题。苦思不得其解。。。希望各路神仙给个提示。


很久以前.有一个部门Microsoft.其下有2个子部门.....如下面所表达的.
Microsoft
|
BFSI MFG
| |
GM IS
| |
PES SAP EAS PES Testing

public partial class _Default : System.Web.UI.Page
{

//1000条数据 包括ID 姓名 部门名称
//现在要插入数据库 检查如果数据库中有此记录 那么进行update 如果没有记录insert
//无论是update 还是insert 都要判断这个部门在上面的树结构中是否存在

//问题:
//判断1 当用户的部门名称在数据库中存在的时候 直接判断
//判断2 当用户的部门为Microsoft BFSI 那么就要截取BFSI。来判断 那么如何判断要截取呢?
//判断3 当用户的部门为BFS 那如何去判断BFS是属于BFSI呢?

//效率:
//针对判断1: 上面直接判断的时候我打算用哈希表匹配 不知效率如何 是否有更快的
//针对判断2: 没想出来
//针对判断3: 没想出来


//假设上面3个问题都解决了
//在nhibernate里 更新Merge的时候 是用Nhibernate的Merge好呢
//还是用拼SQL好呢?(ORACLE) 貌似ORACLE 在对批量操作这方面做的不是很好。

//目的 想求一个高效的方法来完成这一个操作 从判断部门 批量Merge到数据库

//代码如下:
public static List<string> DepartMentList = new List<string>();
protected void Page_Load(object sender, EventArgs e)
{

DepartMentList.Add("Microsoft");
DepartMentList.Add("Microsoft BFSI");
DepartMentList.Add("BFSI");
DepartMentList.Add("IS");
DepartMentList.Add("MFG");
DepartMentList.Add("Microsoft GM");
DepartMentList.Add("MFG");
DepartMentList.Add("Microsoft Testing");
DepartMentList.Add("PE");


DataTable Table_Info = new DataTable();
DataColumn dc = null;
dc = Table_Info.Columns.Add("ID", Type.GetType("System.Int32"));
dc.AutoIncrement = true;
dc.AutoIncrementSeed = 1;
dc.AutoIncrementStep = 1;
dc.AllowDBNull = false;
dc = Table_Info.Columns.Add("EnglishName", Type.GetType("System.String"));
dc = Table_Info.Columns.Add("ChineseName", Type.GetType("System.String"));
dc = Table_Info.Columns.Add("Department", Type.GetType("System.String"));

for (int i = 0; i < 1000; i++)
{
DataRow dr = Table_Info.NewRow();
dr[1] = RndStr(5, RndType.Char);
dr[2] = RndStr(3, RndType.Str);
dr[3] = EndDepartMent();
}

}

public enum RndType
{
Char, Number, Both, Str
};
public static string RndStr(int Len, RndType type)
{
string s = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z,啊,的,快,乐,安,徽,省,好,上,看,的,大,佬,万,科,阿,萨,德";
string[] Chars = s.Split(',');
Random Rnd = new Random();
int Start = 0, End = 0;
switch (type)
{
case RndType.Char:
Start = 0;
End = 26;
break;
case RndType.Str:
Start = 26;
End = 44;
break;
}
s = " ";
for (int i = 0; i < Len; i++)
{
s += Chars[Rnd.Next(Start, End)];
System.Threading.Thread.Sleep(5);
}
return s;
}


public static string EndDepartMent()
{
Random Rnd = new Random();
return DepartMentList[Rnd.Next(1, DepartMentList.Count)];
}
}


...全文
424 50 打赏 收藏 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
子夜__ 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 maco_wang 的回复:]

是用户用操作页面添加这些数据,还是数据库管理员来添加呀?
如果是用户,这些数据是怎么来的?文件?

可以直接插入,没有就创建,都插入以后做合并,提个思路,你可以考虑一下。
[/Quote]
这些都是我YY出来的。。。。。

呵呵 假如就是个TXT

有就UPDATE 没有就INSERT

这个表中还有其他多余的字段

所以考虑下效率看看 你还不睡啊。

我打算去写写。
叶子 2011-03-27
  • 打赏
  • 举报
回复
是用户用操作页面添加这些数据,还是数据库管理员来添加呀?
如果是用户,这些数据是怎么来的?文件?

可以直接插入,没有就创建,都插入以后做合并,提个思路,你可以考虑一下。
子夜__ 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 maco_wang 的回复:]

引用 28 楼 wxr0323 的回复:
引用 27 楼 maco_wang 的回复:

在判断的时候,如果是case when 还是单独走触发器我觉得效果都不好
建议分开处理:如下
SQL code

--假设数据库中有三个部门
declare @department table (departmentid int,departmentName varchar(9))
ins……
[/Quote]
对。就是怕这种情况 或者定一个 匹配3个字符以上 或者部门字数的50%以上就替换 也可以的。。

如果小于50% 那么就抛异常。。。。

下来就是效率了。其实以前做过类似 感觉ORACLE 有个专门做批量处理要比Nhibernate一条一条的快

但是每一条都要遍历 就很影响效率的。
叶子 2011-03-27
  • 打赏
  • 举报
回复
如果数据是一条一条进来的:
当部门不存在的时候,提示:导入人员所在部门不存在,是否创建该部门,并继续导入。
当部门全部匹配的时候不提示,直接导入。
当部门出现上述情况的时候,两个部门是B1,B2,用户导入的参数是B,提示数据库中没有这个部门,是否导入相关部门B1或是B2中,请选择 。
叶子 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 wxr0323 的回复:]
引用 27 楼 maco_wang 的回复:

在判断的时候,如果是case when 还是单独走触发器我觉得效果都不好
建议分开处理:如下
SQL code

--假设数据库中有三个部门
declare @department table (departmentid int,departmentName varchar(9))
insert into @department
s……
[/Quote]
假设数据库里有两个部门是B1,B2
外面传进来的是B,如何对应?打算怎么抛出异常?提示部门无法正确匹配?
子夜__ 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 maco_wang 的回复:]

在判断的时候,如果是case when 还是单独走触发器我觉得效果都不好
建议分开处理:如下
SQL code

--假设数据库中有三个部门
declare @department table (departmentid int,departmentName varchar(9))
insert into @department
select 1,'Microsoft' union all……
[/Quote]
多谢叶子前辈。。。帮助我换了个思路。
子夜__ 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 cj205 的回复:]

Department是一个词。M不要大写啦

叶子的头像换的让我没法转移过来。。。

子夜的问题中
//判断1 当用户的部门名称在数据库中存在的时候 直接判断
//判断2 当用户的部门为Microsoft BFSI 那么就要截取BFSI。来判断 那么如何判断要截取呢?
//判断3 当用户的部门为BFS 那如何去判断BFS是属于BFS……
[/Quote]

笔误。。。。。

第三点 也是这么想的。

还是抛异常 返回 错误行信息 这样比较好。

不知前辈对ORACLE批量操作有经验没
子夜__ 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 maco_wang 的回复:]

在判断的时候,如果是case when 还是单独走触发器我觉得效果都不好
建议分开处理:如下
SQL code

--假设数据库中有三个部门
declare @department table (departmentid int,departmentName varchar(9))
insert into @department
select 1,'Microsoft' union all……
[/Quote]

也是匹配charindex啊

我感觉还是我想多了。。呵呵 万一用户数据是B的话或者M的话就不好匹配了。。。

保险做法 还是抛异常吧。。。。

叶子对ORACLE 批量操作有想法没?
叶子 2011-03-27
  • 打赏
  • 举报
回复
在判断的时候,如果是case when 还是单独走触发器我觉得效果都不好
建议分开处理:如下

--假设数据库中有三个部门
declare @department table (departmentid int,departmentName varchar(9))
insert into @department
select 1,'Microsoft' union all
select 2,'BFSI' union all
select 3,'MFG'
--select * from @department

--假设现在每个部门只有1个人
declare @staff table(userid int identity,username varchar(10),departmentid int)
insert into @staff
select '张三',1 union all
select '李四',2 union all
select '王五',3
--select * from @staff

--假设外面又来了100人(暂时只模拟4条)

declare @table table (ID int,姓名 varchar(2),部门名称 varchar(15))
insert into @table
select 1,'a1','Microsoft1' union all
select 2,'a2','BFSIAS' union all
select 3,'a3','Microsoft2' union all
select 4,'a4','ABC'

--select * from @table

insert into @staff
select * from
(
select 姓名,(select top 1 departmentid from @department
where charindex(departmentName,部门名称)>0) as did from @table
) aa
where did is not null --这是只匹配上的

--把where 条件改为 where did is null 就是进来的部门不存在的

--相当于把进来的1000条数据直接分为2个部分了,这样处理起来方便一些,不知道我理解的对不对。

select * from @staff

--插入后的结果:
/*
userid username departmentid
----------- ---------- ------------
1 张三 1
2 李四 2
3 王五 3
4 a1 1
5 a2 2
6 a3 1
*/
FULIQIANG1 2011-03-27
  • 打赏
  • 举报
回复
菜鸟,期望着一天成为高手
子夜__ 2011-03-27
  • 打赏
  • 举报
回复
YY结束 已经搞出来了。
子夜__ 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 maco_wang 的回复:]

SQL code

--假设数据库中有三个部门
declare @department table (departmentid int,departmentName varchar(9))
insert into @department
select 1,'Microsoft' union all
select 2,'BFSI' union all
select 3,'MFG'
select ……
[/Quote]
对 就是这个意思。
子夜__ 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 maco_wang 的回复:]

SQL code

--假设数据库中有三个部门
declare @department table (departmentid int,departmentName varchar(9))
insert into @department
select 1,'Microsoft' union all
select 2,'BFSI' union all
select 3,'MFG'
select ……
[/Quote]

我先去隔壁帮那姑娘解决个问题。。。你先睡。回来我在仔细思考思考
叶子 2011-03-27
  • 打赏
  • 举报
回复

--假设数据库中有三个部门
declare @department table (departmentid int,departmentName varchar(9))
insert into @department
select 1,'Microsoft' union all
select 2,'BFSI' union all
select 3,'MFG'
select * from @department

--假设现在每个部门只有1个人
declare @staff table(userid int identity,username varchar(10),departmentid int)
insert into @staff
select '张三',1 union all
select '李四',2 union all
select '王五',3
select * from @staff

--假设外面又来了100人(暂时只模拟4条)

declare @table table (ID int,姓名 varchar(2),部门名称 varchar(15))
insert into @table
select 1,'a1','Microsoft1' union all
select 2,'a2','BFSIAS' union all
select 3,'a3','Microsoft2' union all
select 4,'a4','BFSICF'

select * from @table
/*
要把这100个人批量插入员工表中,然后部门根据名称匹配,是这个意思吗?

如果进来的人员的部门是ABC,匹配不到,
则该人员不插入,还是插入后,自动创建部门到部门表?
*/
子夜__ 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 maco_wang 的回复:]

引用 20 楼 cj205 的回复:
Department是一个词。M不要大写啦

叶子的头像换的让我没法转移过来。。。

cj
[/Quote]

姐。麻烦看一下你的消息。。。
叶子 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 cj205 的回复:]
Department是一个词。M不要大写啦

叶子的头像换的让我没法转移过来。。。
[/Quote]
cj
叶子 2011-03-27
  • 打赏
  • 举报
回复
外面的数据是:1000条数据 包括ID 姓名 部门名称
应该部门员工的记录

但是里面是部门表呀?怎么更新?


declare @table table (ID int,姓名 varchar(4),部门名称 varchar(9),c4 varchar(4))
insert into @table
select 1,'张三','Microsoft','BFSI' union all
select 2,'李四','BFSI',null union all
select 3,'王五','Microsoft',null union all
select 4,'刘六','BFSI',null
--...
select * from @table
/*
ID 姓名 部门名称 c4
----------- ---- --------- ----
1 张三 Microsoft BFSI
2 李四 BFSI NULL
3 王五 Microsoft NULL
4 刘六 BFSI NULL
*/


有部门员工关系表吗?
Mr-Jee 2011-03-27
  • 打赏
  • 举报
回复
Department是一个词。M不要大写啦

叶子的头像换的让我没法转移过来。。。

子夜的问题中
//判断1 当用户的部门名称在数据库中存在的时候 直接判断
//判断2 当用户的部门为Microsoft BFSI 那么就要截取BFSI。来判断 那么如何判断要截取呢?
//判断3 当用户的部门为BFS 那如何去判断BFS是属于BFSI呢?

第一个和第二个可以接受,第三个我就不大好接收了。那如果有这样的部门MSI MSII 那你要是输入为MS怎么办。。。对吧。

关于判断二现实中我经常遇到,比如IS,Internet Service,IS部门====。
我的办法很不高效
1、如果部门的关联不大,比如没有两个很相似的部门,那么就直接检查匹配度
2、如果部门的关联大,那就没办法了,做个汇总,比如['IS','Internet Service'...],KEY呢就是数据库的IS。

打完酱油了,飘过
子夜__ 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 maco_wang 的回复:]

引用 16 楼 wxr0323 的回复:
我想出了一个办法。其实是脑筋死了。。

导入的时候判断 是否跟外键表中的数据相符。。

如果不相符的话 就抛个异常。。

然后返回一个出错的记录 提示出来


从新修改数据 一直判断到外键表中存在为止

这样做更保险一些。。呵呵 叶子这种方法也不错 给300分。。


继续下一个问题 批量Merge的问题

要进行批量数……
[/Quote]
对。。。。

数据已经构造好了。
叶子 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wxr0323 的回复:]
我想出了一个办法。其实是脑筋死了。。

导入的时候判断 是否跟外键表中的数据相符。。

如果不相符的话 就抛个异常。。

然后返回一个出错的记录 提示出来


从新修改数据 一直判断到外键表中存在为止

这样做更保险一些。。呵呵 叶子这种方法也不错 给300分。。


继续下一个问题 批量Merge的问题
[/Quote]
要进行批量数据合并,就是外边传进来很多数据,对应匹配?
加载更多回复(25)
内容概要:本文提出了一种基于高保真电磁暂态仿真的智能电网虚假数据注入攻击(FDIA)数据集构建与影响分析方法,依托PSCAD与MATLAB联合仿真平台,构建IEEE标准测试系统(如9节点或39节点系统)的精细化电磁暂态模型,精确模拟电网在正常运行及遭受FDIA下的动态响应过程,采集高精度、高时间分辨率的电压、电流、功率等电气量时序数据,生成具有强物理约束性和可复现性的攻击数据集。研究进一步结合现代状态估计理论、残差检测机制与机器学习分类算法,对FDIA的隐蔽性特征、攻击传播路径、系统关键变量偏移程度及暂态稳定性影响进行系统性量化评估,旨在为智能电网安全防护体系的设计、入侵检测模型的训练与攻防策略的有效性验证提供高可信度的数据基础与理论支撑。; 适合人群:面向电力系统自动化、能源互联网安全、工业控制系统安全等方向的研究生、科研人员及工程技术人员,要求具备电力系统分析、状态估计基础、MATLAB/PSCAD联合仿真能力以及基本的网络安全背景知识。; 使用场景及目标:① 复现和验证主流FDIA相关学术论文中的攻击模型与检测算法;② 构建符合实际物理规律、可用于训练深度学习或机器学习驱动的入侵检测系统(IDS)的真实攻击数据集;③ 深入探究虚假数据注入对电网暂态稳定性、继电保护动作逻辑、频率调节等关键功能的影响机理。; 阅读建议:本资源以高保真仿真为核心,强调数据生成的真实性与实验可重复性,读者应重点关注PSCAD与MATLAB之间的数据交互机制、攻击向量的设计原则与注入方式、以及多维度影响评估指标体系的构建方法,建议结合所提供的仿真模型与代码进行动手实践与结果验证。
内容概要:本文系统阐述了基于格子Boltzmann方法(Lattice Boltzmann Method, LBM)对二维通道内多孔介质流动进行数值模拟的理论体系、Matlab代码实现流程及结果验证方法。深入剖析了LBM在处理复杂流体系统尤其是不规则几何结构多孔介质流动中的独特优势,详细介绍了模型构建过程、边界条件设定、碰撞与传播环节的算法实现机制,并通过Matlab编程完成仿真运算,实现了对速度场、压力场等关键物理量的可视化分析与精度验证,确保模拟结果具备良好的准确性与可靠性。; 适合人群:具备流体力学基础知识和一定Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事多孔介质流动、计算流体力学(CFD)或LBM方法研究的相关领域研究人员。; 使用场景及目标:①掌握格子Boltzmann方法的核心原理及其在多孔介质流动模拟中的具体应用;②学习利用Matlab实现LBM算法并开展科学计算与结果可视化的方法;③为相关科研项目、学术论文复现或实际工程仿真提供可复用的代码框架与技术实施路径。; 阅读建议:建议读者结合流体力学与数值计算相关背景知识,逐步理解算法推导过程,动手运行并调试所提供的Matlab代码,通过调整参数或几何模型加深对LBM方法灵活性与适用性的认识,同时鼓励将该方法拓展至三维流动或多物理场耦合问题的研究中。
内容概要:本文聚焦于“基于变频与移相协同控制的全桥LLC变换器模式切换平滑性优化”这一关键技术问题,通过Simulink仿真平台构建全桥LLC谐振变换器的详细模型,深入研究其在不同工作模式间切换时的动态响应特性。针对传统控制方式在模式切换过程中易引发电压电流冲击、导致系统效率下降与稳定性恶化的问题,提出一种融合变频控制(Frequency Modulation)与移相控制(Phase-Shift Control)的混合协同控制策略。该策略通过精确设计控制逻辑切换时序,优化谐振腔参数匹配,并分析过渡过程中的能量流动规律,有效抑制瞬态波动,实现高效、平稳的模式切换。仿真结果验证了该方法在提升系统动态性能、增强运行可靠性方面的优越性; 适合人群:电力电子、电气工程及其自动化等相关领域的研究生、科研人员以及从事高频电源、新能源变换系统设计的工程技术人员,尤其适合具备电路拓扑分析能力与Simulink建模经验的专业人士; 使用场景及目标:①用于高效率DC-DC变换器中复杂模式切换控制策略的研究与改进;②为电动汽车车载充电机、数据中心电源、光伏微逆变器等对动态性能要求严苛的应用场景提供平滑切换的技术方案;③支撑高水平学术论文的复现、验证与创新性拓展,服务于科研项目中的关键控制算法开发与仿真验证; 阅读建议:建议结合提供的Simulink模型进行同步操作,重点关注变频与移相控制的切换逻辑、参数整定方法及过渡过程的能量管理机制,深入理解两种控制方式的协同作用原理,并可通过调整负载条件、输入电压或谐振元件参数开展多工况仿真分析,以全面掌握系统动态特性。

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧