首页 > 其他分享 >达梦DOTNET驱动DM.Provider8.3.1.30495存在空字符串插入变DBNull的问题

达梦DOTNET驱动DM.Provider8.3.1.30495存在空字符串插入变DBNull的问题

时间:2024-12-13 11:58:24浏览次数:10  
标签:case DM prec break paraVal scale paraInternal DOTNET 1.30495

达梦数据库的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();
	}
}

标签:case,DM,prec,break,paraVal,scale,paraInternal,DOTNET,1.30495
From: https://www.cnblogs.com/pains/p/18604629

相关文章

  • REDME-dev
    XX后台管理系统1.技术选型与环境要求1.1项目技术选型1.1.1前端技术HTML5CSS3lavaScriptVueElementUI1.1.2后端技术SpringBootMyBatisPlusSpringSecurityjwtDM81.2项目环境要求1.2.1前端环境要求node.jsVSCodegit1.2.2后端环境要求jdk8+maven......
  • builder.Services.AddMvc
    在.NET中,builder.Services.AddMvc是一个用于在ASP.NETCore应用程序中添加MVC框架服务的方法。当你在构建服务容器时调用这个方法,它会将MVC框架所需的服务添加到服务容器中。以下是一些关键点:添加MVC服务:AddMvc方法会将MVC框架所需的所有服务添加到服务容器中,包括路由、模型......
  • 股票数据接口API实例代码python、JAVA等多种语言演示免费获取实时数据、历史数据、CDM
    ​本文中所有接口均可直接在浏览器打开获取数据,为了便于大家验证有效性,已经做好了超链接,直接点击即可!沪深两市股票列表API接口链接(可点击验证):https://api.mairui.club/hslt/list/b997d4403688d5e66a【实时数据接口】沪深两市实时交易数据接口API接口链接(可点击验证):htt......
  • 网站admin忘记如何修改密码,如何重置网站后台管理员密码
    忘记网站后台管理员密码是一个常见问题,但可以通过以下步骤安全地重置密码:通过后台管理界面重置:如果您有其他管理员权限的账户,可以使用该账户登录后台,然后导航到用户管理页面重置忘记密码的账户。步骤:登录网站后台。导航到“用户管理”或“管理员管理”。找到忘记密码的......
  • FastAdmin 前端页面传参
    如果我们需要自己在控制器中透传数据到JS中去,则可以使用控制器的assignconfig方法来透传,使用如下$this->assignconfig('demo',['name'=>'名称']);然后我们就可以在JS中使用Config.demo.name来获取对应的数据那么你的问题也就可以先在控制器中使用assignconfig来渲染,如$this->a......
  • dotnet core微服务框架Jimu ~部署和调用演示
     首先运行consul下载consul以开发模式运行consulagent-dev2.调试用VisualStudio2022IDE打开项目;右击解决方案-选择“属性”在属性界面下,选择多项目启动,News.Server,Auth.Server,Register.Server,ApiGateway几个项目的操作方式选择为“启动”;如......
  • RabbitMQ——CLI 管理工具 rabbitmqadmin
    前言一般情况下,我们会使用rabbitmq_management插件,通过WebUI的方式来监控和操作RabbitMQ(端口15672),但有时候命令的方式会更加方便一些,RabbitMQ提供了CLI管理工具rabbitmqadmin,其实就是基于RabbitMQ的HTTPAPI,用Python写的一个脚本。rabbitmqadmin提供了下面功......
  • 串口空闲中断+DMA收发不定长数据
    编写代码时遇到了两个问题在串口使用DMA传输数据并且需要每传输一帧数据后产生空闲中断时出现问题问题原因:误认为hal库串口的空闲中断和接收中断使用的是同一个接收回调函数HAL_UART_Receive_IT(该函数会开启接收中断:标志位UART_IT_RXNE),经过查找发现接收中断回调函数只是在置......
  • kubeadm 部署k8s
    闲聊考虑了很久,打算写一篇保姆级部署从0-1构建企业级cicd流水线,把工作上面所用到的技术点分享给大家。从最k8s,harbor,jenkins,gitlab,docker的详细部署到集成。前后端流水线的构建,发布等...如果以下内容有不足的地方,请指出,我会第一时间更正。谢谢大家。先上一下手绘导图,大致的流程......
  • 网站登录密码admin怎么修改,如何安全地修改网站管理员登录密码
    修改网站管理员登录密码是确保网站安全的重要步骤。以下是详细的步骤:登录后台管理系统:打开浏览器,输入后台管理地址(如http://yourdomain.com/admin.php或http://yourdomain.com/wp-admin),使用管理员账号登录。导航到用户管理:在后台左侧菜单中,找到“用户”或“用户管理”......