C# 如何将NpgsqlCopyIn与NpgsqlCopySerializer一起使用?
如果我正确理解NpgsqlCopyIn和NpgsqlCopySerializer的工作原理如下:C# 如何将NpgsqlCopyIn与NpgsqlCopySerializer一起使用?,c#,postgresql,npgsql,C#,Postgresql,Npgsql,如果我正确理解NpgsqlCopyIn和NpgsqlCopySerializer的工作原理如下: var conn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["PostgreSqlDb"].ConnectionString); conn.Open(); var tran = conn.BeginTransaction(); var cmd = new NpgsqlCommand("COPY address (id,
var conn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["PostgreSqlDb"].ConnectionString);
conn.Open();
var tran = conn.BeginTransaction();
var cmd = new NpgsqlCommand("COPY address (id, employee, value) FROM STDIN", conn);
var npgsqlCopySerializer = new NpgsqlCopySerializer(conn);
var npgsqlCopyIn = new NpgsqlCopyIn(cmd, conn, npgsqlCopySerializer.ToStream);
try
{
npgsqlCopyIn.Start();
npgsqlCopySerializer.AddInt32(300);
npgsqlCopySerializer.AddInt32(1);
npgsqlCopySerializer.AddString("address");
npgsqlCopySerializer.EndRow();
npgsqlCopySerializer.Flush();
npgsqlCopySerializer.AddInt32(301);
npgsqlCopySerializer.AddInt32(1);
npgsqlCopySerializer.AddString("another\r\naddress");
npgsqlCopySerializer.EndRow();
npgsqlCopySerializer.Flush();
npgsqlCopyIn.End();
tran.Commit();
}
//catch (Exception e)
//{
// tran.Rollback();
// throw;
//}
finally
{
conn.Close();
}
问题是每次在AddString()
中出现不允许的字符时,它都会在该方法中抛出一个ArgumentOutOfRangeException
,否则它会工作
例如:
npgsqlCopySerializer.AddString("another\r\naddress");
将引发异常,因为它包含在(行分隔符)中具有特殊含义的换行符,应该转义
有人知道我能做些什么让它工作吗?我在网上搜索了一些例子,但什么也找不到
谢谢你的帮助 引自:
强烈建议生成复制数据的应用程序将数据换行和回车分别转换为\n和\r序列。目前,可以通过反斜杠和回车来表示数据回车,也可以通过反斜杠和换行来表示数据换行
因此,我想说,以下几点将起作用:
npgsqlCopySerializer.AddString("another\\\r\\\naddress");
编辑:我自己尝试过,但在NpgsqlCopySerializer.AddString()中似乎有一个bug
:
第二行在处理两个转义序列(\r
和\n
)并将其添加到输出缓冲区后抛出ArgumentOutOfRangeException
,因为此时bufferedUpto==9
和escapeAt==“另一个\r\naddress”。长度==16
现在,我甚至在Npgsql跟踪器上找到了报告。引自:
强烈建议生成复制数据的应用程序将数据换行和回车分别转换为\n和\r序列。目前,可以通过反斜杠和回车来表示数据回车,也可以通过反斜杠和换行来表示数据换行
因此,我想说,以下几点将起作用:
npgsqlCopySerializer.AddString("another\\\r\\\naddress");
编辑:我自己尝试过,但在NpgsqlCopySerializer.AddString()中似乎有一个bug
:
第二行在处理两个转义序列(\r
和\n
)并将其添加到输出缓冲区后抛出ArgumentOutOfRangeException
,因为此时bufferedUpto==9
和escapeAt==“另一个\r\naddress”。长度==16
现在我甚至在Npgsql跟踪器上找到了报告。我就是报告这个错误的人,恰好是几天前 您介意发布您尝试插入的XML吗?我用OSM结果进行了尝试: 还有一个相当大的web.config文件,两者都可以完美地工作。因此,要么我在提交修复程序时出现了复制/粘贴错误,要么您尝试插入的XML与我尝试插入的XML不同 另外:您是否得到与以前完全相同的错误(即参数超出范围)?默认的缓冲区大小只有8k,这在我的情况下是不够的 我不知道这是否有什么区别,但我根本没有使用flush:
NpgsqlConnection Conn = new NpgsqlConnection(getPostgresConnString());
Conn.Open();
NpgsqlCopyIn copyIn = new NpgsqlCopyIn("COPY table (col1,col2,col2) FROM STDIN;", Conn);
copyIn.Start();
NpgsqlCopySerializer cs1 = new NpgsqlCopySerializer(pConn2);
cs1.AddString(System.IO.File.ReadAllText("C:\\test\\Web.config"));
[...]
cs1.EndRow();
cs1.Close();
copyIn.End();
我是报告这个错误的人,巧合的是就在几天前 您介意发布您尝试插入的XML吗?我用OSM结果进行了尝试: 还有一个相当大的web.config文件,两者都可以完美地工作。因此,要么我在提交修复程序时出现了复制/粘贴错误,要么您尝试插入的XML与我尝试插入的XML不同 另外:您是否得到与以前完全相同的错误(即参数超出范围)?默认的缓冲区大小只有8k,这在我的情况下是不够的 我不知道这是否有什么区别,但我根本没有使用flush:
NpgsqlConnection Conn = new NpgsqlConnection(getPostgresConnString());
Conn.Open();
NpgsqlCopyIn copyIn = new NpgsqlCopyIn("COPY table (col1,col2,col2) FROM STDIN;", Conn);
copyIn.Start();
NpgsqlCopySerializer cs1 = new NpgsqlCopySerializer(pConn2);
cs1.AddString(System.IO.File.ReadAllText("C:\\test\\Web.config"));
[...]
cs1.EndRow();
cs1.Close();
copyIn.End();
我尝试了1到4之间的任意数量的反斜杠,并且在所有情况下都抛出了
ArgumentOutOfRangeException
。我应用了bug报告中指定的修补程序,它与\r\n
和其他简单测试一起工作,但当数据字符串为xml时,它仍然崩溃。不管怎样,为你的努力+1:)嗨,拉兹万。您是否介意将您的反馈添加到npgsql项目页面上的bug报告中?这将有助于twoflower和其他人对此问题进行更多的测试,并生成修复此问题的修补程序。提前感谢。@FranciscoJunior:引发的异常是NpgsqlCopySerializer缓冲区设置程序中的“IndexOutofFrangeException”。异常似乎不是内容类型(xml)的原因,而是AddString数据大小的原因。我添加的xml字段大约有70KB,默认缓冲区是8KB。我将npgsqlCopySerializer.BufferSize设置为足够高的值,现在它可以工作了。我尝试了1到4之间的任意数量的反斜杠,并且在所有情况下都抛出了ArgumentOutOfRangeException
。我应用了错误报告中指定的修补程序,它与\r\n
和其他简单测试一起工作,但当数据丢失时它仍然崩溃字符串是xml。不管怎样,为你的努力+1:)嗨,拉兹万。您是否介意将您的反馈添加到npgsql项目页面上的bug报告中?这将有助于twoflower和其他人对此问题进行更多的测试,并生成修复此问题的修补程序。提前感谢。@FranciscoJunior:引发的异常是NpgsqlCopySerializer缓冲区设置程序中的“IndexOutofFrangeException”。异常似乎不是内容类型(xml)的原因,而是AddString数据大小的原因。我添加的xml字段大约有70KB,默认缓冲区是8KB。我将npgsqlCopySerializer.BufferSize设置为足够高的值,现在它可以工作了。应用补丁后,XML的异常是与缓冲区大小相关的,正如您所说的。我设置了一个合适的缓冲区大小,它就工作了。谢谢刚刚把Jelmer的补丁提交给cvs。谢谢你的补丁,杰尔默,也谢谢Răzvan的测试和反馈。什么是pConn2
?是否有必要与Conn不同?@brianestey我认为这是一个打字错误,在这种情况下。尽管存在这样一种情况,即具有打开记录集的连接不允许触发第二个查询。只是不确定这是否适用