开发中遇到的部分问题及一些收获
开发中遇到的部分问题及一些收获
前情提要:
作为一个工作一年的码畜,总结一下近一年来出过的错误和解决方法,以及部分收获。以下是正文:
一、Sqlserver数据库问题:
1.从数据库中直接复制到Excl的数据会改Excl的单元格格式
例如,拷入日期后,该单元格会变成日期格式,然后删掉后再复制数值进去也会变成日期,例如1900-01-01
2.sql字符串,如果数字0.0000006 加引号变成科学技术法,无法插入库中。
3.sql字符串,如果string类型的字段中包含“'”应替换成“’’” 否则无法插入
4.数据库奇怪的错误: 字段Patient_No
SELECT * FROM dbo.CheckRecord WHERE PatientNo IN (SELECT PatientNo from dbo.InPatient_STEMI) AND
(Check_Item_Name LIKE '%心脏超声%' OR Check_Item_Name LIKE '%超声心动图%')
5.like 和not like不能包含全部数据 (例如null就不行)
之前做过一个统计数据的用like 和not like查询了下病历content中包含关键字的记录数,发现包含的和不包含的记录数之和不等于全部记录数,百思不得其解,后来发现like 和not like不能查到为null的数据
6.数据库中字段后面有空格也能查到数据,但放在程序里是无法相等的。
例如:用patientno=‘312412551 ’能查到 patientno=‘312412551’的数据,但他俩字符串不相等。
7.关联的时候条件中有or的,少加括号数据差的不是一星半点(数据大爆炸,两个表同PATIENT_NO 的几何倍数的数据)
错误
--入院或出院科室为产科或妇科的全部EMR信息
SELECT a.* FROM DP_EMR_RECORD a,DP_IN_PATIENT b WHERE a.PATIENT_NO=b.PATIENT_NO
AND b.IN_DEPT_NAME IN ('产科','妇科') OR b.OUT_DEPT_NAME IN ('产科','妇科')
--入院或出院科室为产科或妇科的全部EMR信息
正确
SELECT a.* FROM DP_EMR_RECORD a,DP_IN_PATIENT b WHERE a.PATIENT_NO=b.PATIENT_NO
AND (b.IN_DEPT_NAME IN ('产科','妇科') OR b.OUT_DEPT_NAME IN ('产科','妇科'))
8.跨连接查询的方法
方法一:使用openrowset('SQLOLEDB','servers';'id';'pwd',[databasename].[dbo].[tablename])来进行跨连接查询
SELECT DISTINCT CASE_NO,Baby_Birth_Weight1 FROM openrowset('SQLOLEDB','192.168.2.110\hjcdr';'sa';'rjgcbzy2.110',[HJIDataPlatform_FE_20160426_CDR].[dbo].[MedicalRecord]) m where m.CASE_NO IN (
SELECT INP_NO FROM PAT_VISIT where PATIENT_NO in (SELECT p.PATIENT_NO FROM PAT_SD_QUEUE p where SD_CODE='SEPSIS'))
方法二:点击 服务器对象-链接服务器-新建链接服务器-链接服务器起名-选中sqlserver-安全性最后一个‘使用此安全上下文建立连接’-输入用户名密码点确定 然后可以直接‘.’出来[192.168.2.110\HJCDR].HJIDataPlatform_FE_20160426_CDR.dbo.inpatient
19.错误日志中纠错sql添加语句,不要看是第几个字段,要看清字段名
二、程序中遇到的问题:
1.简单的程序,调试不出来,错误一般都在sql或数据库连接里
2.操作前判断为空
2.1拼接sql字符串用“in”的时候一定要先判断中间的字符串不能为空。 以为sql中 in() 括号里没东西是要报错的。
if (!string.IsNullOrEmpty(lspnstr)){}
2.2.遍历表之前或用索引取数组或集合中数据时也一定要判断数组或集合不为空。
例:
string[] a = new string[2];
if (a != null && a.Length > 0) { }
List<string> b = new List<string>();
if (b!=null&& b.Count > 0) { };
DataTable dt = new DataTable();
if (dt!= null && dt.Rows.Count > 0) { };
3.集合可以用Except、Intersect、Union、AddRange、Distinct等方法操作集合 。
例:
List<string> a = new List<string> { "pid1", "pid2", "pid2", "pid3" };
List<string> b = new List<string>() { "pid1", "pid3", "pid3", "pid4" };
List<string> c = new List<string>();
List<string> d = new List<string>();
List<string> f = new List<string>();
List<string> g = new List<string>();
c = a.Intersect(b).ToList(); //取交集并去重结果为 pid1,pid3
d = a.Except(b).ToList(); //取差集并去重结果为 pid2
f = a.Union(b).ToList(); //取并集并去重结果为 pid1,pid2,pid3,pid4
a.AddRange(b); //加在最后 AddRange是直接加在集合后面,无返回值结果为 pid1,pid2,pid2,pid3,pid1,pid3,pid3,pid4
4.才知道断点可以直接拖上去重新往下调试
5.正则中,因为之前刚玩,犯过很多低级错误,很耗时。
解:查询结果有误或出错时,先看是不是少了标点符号或者正则没转义。
6.循环使用的变量一定要先清空再赋值,不要让他存上一条的数据!!!
7.查询处理器用尽了内部资源,无法生成查询计划。
解决方法:分批查询
8.数据库连接超时问题
解决方法:设置超时时间
"Persist Security Info=False;User id=sa;pwd=123;database=data;server=ip;Connection Timeout=N"
9.找不到TestResult(表名)对象
原因是数据量太大,数据丢失,找不到表名,可以按住院时间分段查询(10天一批)就可以了
10.异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息
后来从网上百度到解决方法是:
在Debug -> Exceptions -> Managed Debug Assistants里 去掉ContextSwitchDeadlock一项前面的钩。
在调试(菜单)-->异常--> Managed Debug Assistants里 去掉ContextSwitchDeadlock一项前面的钩。

浙公网安备 33010602011771号