Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将NpgsqlCopyIn与NpgsqlCopySerializer一起使用?_C#_Postgresql_Npgsql - Fatal编程技术网

C# 如何将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,

如果我正确理解NpgsqlCopyIn和NpgsqlCopySerializer的工作原理如下:

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我认为这是一个打字错误,在这种情况下。尽管存在这样一种情况,即具有打开记录集的连接不允许触发第二个查询。只是不确定这是否适用