PG 批量写入数据报错
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 )";
向临时表中添加数据的代码:
调试的时候在这一步报错:
提示的异常是:“Tried to add too many fields to a copy record with 1 fields ”。如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
昨天试了一下,发现修改了CopyBufferSize之后不再报这个错误,暂时先这样吧。