C#环境下一次性写1万多条数据,调用数据库接口之后有时候会报出以下错误信息:
2015/10/19 18:56:04 Tried to add too many fields to a copy record with 1 fields 2015/10/19 18:56:05 Tried to add too many fields to a copy record with 3 fields 2015/10/19 18:56:05 Tried to add too many fields to a copy record with 4 fields以上是调试信息的一部分,调用同样的接口写入同种类型的数据,报出的错误稍微不同,但是错误类型是一样的。
接口中的逻辑:
1.先创建临时表
2.使用PG的bulk copy将数据批量写入临时表
PG bulk copy 代码如下:
using (PostgreSQLCopyDataToTempTableHelper copyHelper = new PostgreSQLCopyDataToTempTableHelper(conn, "COPY TEMP_WRITEFIXPERIOD(nodetype, nodeid, dataid, recordtime, periodtype, sourcetype, datavalue, maxvalue, minvalue, avgvalue) FROM STDIN")) { if (!copyHelper.Initialize()) return copyHelper.ErrorCode; try { for (int i = 0; i < logs.Length; ++i) { copyHelper.AddValue(logs[i].nodeType); copyHelper.AddValue(logs[i].nodeID); copyHelper.AddValue(logs[i].dataID); copyHelper.AddValue(logs[i].recordTime); copyHelper.AddValue(logs[i].periodType); copyHelper.AddValue(logs[i].sourceType); copyHelper.AddValue(logs[i].dataValue); copyHelper.AddValue(logs[i].maxValue); copyHelper.AddValue(logs[i].minValue); copyHelper.AddValue(logs[i].avgValue); copyHelper.AddEndRow(); } } catch (System.Exception ex) { Plugin.GlobalInformation.LastErrorString = ex.Message; return (int)ErrorCode.SPCommonError; } return copyHelper.CopyDataToTempTable(); }
copyHelper.Initialize()执行批量处理的初始化工作,代码如下:
public bool Initialize() { try { npgsqlCommand = new NpgsqlCommand(copyDataToTempTableQuery, npgsqlConnection); npgsqlCopySerializer = new NpgsqlCopySerializer(npgsqlConnection); npgsqlCopyIn = new NpgsqlCopyIn(npgsqlCommand, npgsqlConnection, npgsqlCopySerializer.ToStream); npgsqlCopyIn.Start(); return true; } catch (System.Exception ex) { Plugin.GlobalInformation.LastErrorString = ex.Message; errorCode = (int)DBInterfaceCommonLib.ErrorCode.SPCommonError; return false; } }
copyHelper.CopyDataToTempTable()执行批量将数据写入临时表的操作,代码如下:
public int CopyDataToTempTable() { try { npgsqlCopySerializer.Flush(); npgsqlCopyIn.End(); return (int)DBInterfaceCommonLib.ErrorCode.Success; } catch (NpgsqlException ex) { try { npgsqlCopyIn.Cancel("Undo copy"); } catch (Exception ex2) { Plugin.GlobalInformation.LastErrorString = "Failed to cancel copy: " + ex2.Message + " Copy failure: " + ex.Message; return (int)DBInterfaceCommonLib.ErrorCode.SPCommonError; } Plugin.GlobalInformation.LastErrorString = ex.Message; return (int)DBInterfaceCommonLib.ErrorCode.SPCommonError; } }
public const string createTempTableForWriteFixPeriodDatas = @"CREATE TEMP TABLE TEMP_WRITEFIXPERIOD ( nodetype integer NOT NULL, nodeid integer NOT NULL, dataid integer NOT NULL, recordtime timestamp without time zone NOT NULL, periodtype smallint NOT NULL, sourcetype smallint NOT NULL, datavalue bigint, maxvalue bigint, minvalue bigint, avgvalue bigint )";
向临时表中添加数据的代码:
调试的时候在这一步报错:
<div>
调试发现,npgsqlCopyIn.FieldCount 理论上10,但是程序运行中不知道什么原因变成1
</div>
请各位大侠帮忙分析一下原因,小弟万分感谢。
昨天试了一下,发现修改了CopyBufferSize之后不再报这个错误,暂时先这样吧。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。