惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
P
Proofpoint News Feed
D
DataBreaches.Net
C
Check Point Blog
L
LangChain Blog
量子位
美团技术团队
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
V
Visual Studio Blog
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
腾讯CDC
M
MIT News - Artificial intelligence
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale

博客园 - Rick Carter

官方APP太难用了,所以我写了个 OpenNas App 死锁是怎么发生的,举个简单的例子 hangfire内部执行器是同步的,会导致死锁 缓存读写代码逻辑的正确姿势 dotnet未捕获异常导致系统崩溃问题 dotnet-dump安装、收集dump和崩溃自动收集dump EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包) 修复达梦EFCore驱动布尔类型兼容问题 dotnet使用redis时需要注意的问题 巧用 using 作用域(IDisposable)的生命周期包装特性 实现前后置处理 非托管内存怎么计算? dotnet集合类型性能优化的两个小儿科的知识点 一个前端树形控件联动勾选框卡顿问题及解决 .net c# Func<Task>及变体做为多播委托异步执行会另开线程的问题 关于EFCore插件API使用中踩过的坑 利用C#9.0中的record提高性能 dotnet CultureInfo遇到欧洲如俄文小数点是逗号想转点的解决办法 hangfire.entityframeworkcore这个库因为System.Threading.Timer未停止也未释放而导致的性能问题 达梦DM.Microsoft.EntityFreameworkCore查询报错invalid cast from DateTime to DateTimeOffset 是否可以考虑做一个dotnet应用的性能诊断工具
达梦DOTNET驱动DM.Provider8.3.1.30495存在空字符串插入变DBN...
Rick Carter · 2024-12-13 · via 博客园 - Rick Carter

达梦数据库的DOTNET驱动DM.Provider,这个版本8.3.1.30495有bug,会把空字符串改成DBNull处理,反编译代码发现Dm.DmSetValue.SetString方法中判断字符串长度==0就设置成DBNull。
解决办法就是 降低版本到8.3.1.28188

// Dm.DmSetValue
using System;
using System.Globalization;
using Dm.util;

private void SetString(DmParamValue paraVal, string x, int cType, int prec, int scale, byte typeFlag, DmParameterInternal paraInternal)
{
	byte[] array = null;
	if (x == null || x.Trim().Length <= 0) //注意这里的 x.Trim().Length <= 0 就是它导致的,8.3.1.28188版本没有这个条件
	{
		SetNull(paraVal);
		return;
	}
	if (typeFlag != 1)
	{
		array = DmConvertion.GetBytes(x, m_ServerEncoding);
		paraVal.SetInValue(array);
		paraVal.SetSqlType(2);
		paraVal.SetPrec(8188);
		paraVal.SetScale(6);
		paraInternal.maxValueLen = Math.Max(array.Length, paraInternal.maxValueLen);
		return;
	}
	switch (cType)
	{
	case 0:
	case 1:
	case 2:
	{
		paraVal.m_InValue = DmConvertion.GetBytes(x, m_ServerEncoding);
		int num = paraVal.m_InValue.Length;
		if (num > 32767)
		{
			DmError.ThrowDmException(DmErrorDefinition.ECNET_STR_CUT);
		}
		paraVal.SetInValue();
		paraInternal.maxValueLen = Math.Max(num, paraInternal.maxValueLen);
		break;
	}
	case 19:
	{
		paraVal.m_InValue = DmConvertion.GetBytes(x, m_ServerEncoding);
		int num = paraVal.m_InValue.Length;
		if (prec < num && prec != 0)
		{
			DmError.ThrowDmException(DmErrorDefinition.ECNET_STR_CUT);
		}
		paraVal.SetInValue();
		break;
	}
	case 3:
	{
		byte b = 0;
		string text = x.Trim().ToUpper();
		if (text.ToUpper().Equals("FALSE") || text.Equals("0"))
		{
			b = 0;
		}
		else if (text.ToUpper().Equals("TRUE") || text.Equals("1"))
		{
			b = 1;
		}
		else
		{
			DmError.ThrowDmException(DmErrorDefinition.ECNET_DATA_CONVERTION_ERROR);
		}
		SetByte(paraVal, (sbyte)b, cType, prec, scale, typeFlag, paraInternal);
		break;
	}
	case 5:
		if (x.Trim().Length > 0)
		{
			SetByte(paraVal, sbyte.Parse(x, DmConst.invariantCulture), cType, prec, scale, typeFlag, paraInternal);
		}
		else
		{
			SetNull(paraVal);
		}
		break;
	case 6:
		if (x.Trim().Length > 0)
		{
			SetShort(paraVal, short.Parse(x, DmConst.invariantCulture), cType, prec, scale, typeFlag, paraInternal);
		}
		else
		{
			SetNull(paraVal);
		}
		break;
	case 7:
		if (x.Trim().Length > 0)
		{
			SetInt(paraVal, int.Parse(x, DmConst.invariantCulture), cType, prec, scale, typeFlag, paraInternal);
		}
		else
		{
			SetNull(paraVal);
		}
		break;
	case 8:
		if (x.Trim().Length > 0)
		{
			SetLong(paraVal, long.Parse(x, DmConst.invariantCulture), cType, prec, scale, typeFlag, paraInternal);
		}
		else
		{
			SetNull(paraVal);
		}
		break;
	case 10:
		if (x.Trim().Length > 0)
		{
			x = ReplaceNumPoint(x);
			SetFloat(paraVal, float.Parse(x, DmConst.invariantCulture), cType, prec, scale, typeFlag, paraInternal);
		}
		else
		{
			SetNull(paraVal);
		}
		break;
	case 11:
		if (x.Trim().Length > 0)
		{
			x = ReplaceNumPoint(x);
			SetDouble(paraVal, double.Parse(x, DmConst.invariantCulture), cType, prec, scale, typeFlag, paraInternal);
		}
		else
		{
			SetNull(paraVal);
		}
		break;
	case 9:
	case 24:
		if (x.Trim().Length > 19)
		{
			x = ReplaceNumPoint(x);
			SetDmDecimal(paraVal, new DmXDec().Parse(x), cType, prec, scale, typeFlag, paraInternal);
		}
		else if (x.Trim().Length > 0)
		{
			x = ReplaceNumPoint(x);
			SetBigDecimal(paraVal, decimal.Parse(x, NumberStyles.Any, DmConst.invariantCulture), cType, prec, scale, typeFlag, paraInternal);
		}
		else
		{
			SetNull(paraVal);
		}
		break;
	case 17:
	{
		array = (byte[])(object)StringUtil.hexStringToBytes(x);
		int num = array.Length;
		byte[] array2;
		if (prec == num || prec == 0)
		{
			array2 = array;
		}
		else
		{
			array2 = new byte[prec];
			if (prec > num)
			{
				Array.Copy(array, 0, array2, 0, num);
				for (int i = num; i < prec; i++)
				{
					array2[i] = 0;
				}
			}
			else
			{
				Array.Copy(array, 0, array2, 0, prec);
			}
		}
		paraVal.SetInValue(array2);
		break;
	}
	case 12:
	case 18:
	{
		if (DmSqlType.isComplexType(cType, scale))
		{
			DmError.ThrowDmException(DmErrorDefinition.ECNET_DATA_CONVERTION_ERROR);
		}
		array = (byte[])(object)StringUtil.hexStringToBytes(x);
		int num = array.Length;
		byte[] array2;
		if (prec < num && prec != 0)
		{
			array2 = new byte[prec];
			Array.Copy(array, 0, array2, 0, prec);
		}
		else
		{
			array2 = array;
		}
		paraVal.SetInValue(array2);
		break;
	}
	case 14:
	{
		if (typeFlag != 1)
		{
			paraVal.SetSqlType(14);
			paraVal.SetPrec(3);
			paraVal.SetScale(6);
			paraInternal.scale = 6;
		}
		DmDateTime dmDateTime = DmDateTime.valueOf(x, paraInternal, m_Statement.G().Conn);
		paraVal.SetInValue(dmDateTime.encode(paraInternal, m_Statement.G().Conn));
		break;
	}
	case 15:
	{
		if (typeFlag != 1)
		{
			paraVal.SetSqlType(15);
			paraVal.SetPrec(5);
			paraVal.SetScale(6);
			paraInternal.scale = 6;
		}
		DmDateTime dmDateTime = DmDateTime.valueOf(x, paraInternal, m_Statement.G().Conn);
		paraVal.SetInValue(dmDateTime.encode(paraInternal, m_Statement.G().Conn));
		break;
	}
	case 22:
	{
		DmDateTime dmDateTime = DmDateTime.valueOf(x, paraInternal, m_Statement.G().Conn);
		paraVal.SetInValue(dmDateTime.encode(paraInternal, m_Statement.G().Conn));
		break;
	}
	case 16:
	{
		DmDateTime dmDateTime = DmDateTime.valueOf(x, paraInternal, m_Statement.G().Conn);
		if (typeFlag != 1)
		{
			paraVal.SetSqlType(16);
			paraVal.SetPrec(8);
			paraVal.SetScale(6);
			paraInternal.scale = 6;
		}
		paraVal.SetInValue(dmDateTime.encode(paraInternal, m_Statement.G().Conn));
		break;
	}
	case 23:
	{
		DmDateTime dmDateTime = DmDateTime.valueOf(x, paraInternal, m_Statement.G().Conn);
		paraVal.SetInValue(dmDateTime.encode(paraInternal, m_Statement.G().Conn));
		break;
	}
	case 21:
	{
		int secScale = scale & 0xF;
		int leadScale = (scale >> 4) & 0xF;
		byte type = (byte)((uint)(scale >> 8) & 0xFu);
		if (x.Trim().Length > 0)
		{
			SetINTERVALDT(paraVal, new DmIntervalDT(x, type, leadScale, secScale), cType, prec, scale, typeFlag, paraInternal);
		}
		else
		{
			SetNull(paraVal);
		}
		break;
	}
	case 20:
		if (x.Trim().Length > 0)
		{
			SetINTERVALYM(paraVal, new DmIntervalYM(x, scale), cType, prec, scale, typeFlag, paraInternal);
		}
		else
		{
			SetNull(paraVal);
		}
		break;
	case 28:
		paraVal.SetInValue(DmRowId.valueOf(x).encode(m_Statement.G().Conn));
		break;
	default:
		throw new InvalidCastException();
	}
}