Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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# 插入到xml postgres c中#_C#_Postgresql_Dapper - Fatal编程技术网

C# 插入到xml postgres c中#

C# 插入到xml postgres c中#,c#,postgresql,dapper,C#,Postgresql,Dapper,我执行从c#到postgres的插入查询时遇到困难。我同时使用dapper和npgsql 我使用的方法是: public void InsertQuery(XmlDocument xmlDoc) { var query = "INSERT INTO cars(name, price, xml_file) VALUES(@name, @price, @xmlDoc)"; DynamicParameters dynamicParams =

我执行从c#到postgres的插入查询时遇到困难。我同时使用dapper和npgsql

我使用的方法是:

public void InsertQuery(XmlDocument xmlDoc)
    {
        var query = "INSERT INTO cars(name, price, xml_file) VALUES(@name, @price, @xmlDoc)";

        DynamicParameters dynamicParams = new DynamicParameters();
        dynamicParams.Add("@name", "pegot2", DbType.AnsiString, ParameterDirection.Input, 255);
        dynamicParams.Add("@price", 15000);
        dynamicParams.Add("@xmlDoc", xmlDoc, DbType.Xml,ParameterDirection.Input);

        try
        {
            int res = Connection.Execute(query, dynamicParams);
            if (res > 0)
            {
                Console.WriteLine("row inserted");
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught exception:\n" + e);
            throw;
        }
    }
我使用的表如下所示:

当我尝试执行查询时,出现以下错误:

System.InvalidCastException: 'Can't write CLR type System.Xml.XmlDocument with handler type TextHandler'

我敢肯定我把语法搞砸了。欢迎任何帮助

我的答案有两种解决方案,但都跳过了这一行:

//<?xml version="1.0" encoding="UTF-8"?>

public void InsertQuery(XmlDocument xmlDoc)
{
    var query = "INSERT INTO cars(name, price, xml_file) VALUES(@name, @price, @xmlDoc)";

    DynamicParameters dynamicParams = new DynamicParameters();
    dynamicParams.Add("@name", "pegot2", DbType.AnsiString, ParameterDirection.Input, 255);
    dynamicParams.Add("@price", 15000);

    //can use xmlDoc.OuterXml too
    dynamicParams.Add("@xmlDoc", XmlToString(xmlDoc), DbType.Xml,ParameterDirection.Input);

    try
    {
        int res = Connection.Execute(query, dynamicParams);
        if (res > 0)
        {
            Console.WriteLine("row inserted");
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("Caught exception:\n" + e);
        throw;
    }
}

    //.OuterXml also seems to work
    public string XmlToString(XmlDocument myxml)
    {

        StringWriter sw = new StringWriter();
        XmlTextWriter tx = new XmlTextWriter(sw);
        myxml.WriteTo(tx);

        return sw.ToString();
    } 
//
公共void InsertQuery(XmlDocument xmlDoc)
{
var query=“在汽车(名称、价格、xml_文件)中插入值(@name、@price、@xmlDoc)”;
DynamicParameters DynamicParameters=新的DynamicParameters();
添加(“@name”,“pegot2”,DbType.ansisting,ParameterDirection.Input,255);
添加(“@price”,15000);
//也可以使用xmlDoc.OuterXml
dynamicParams.Add(“@xmlDoc”,XmlToString(xmlDoc),DbType.Xml,ParameterDirection.Input);
尝试
{
int res=Connection.Execute(查询、动态内存);
如果(分辨率>0)
{
控制台写入线(“插入行”);
}
}
捕获(例外e)
{
Console.WriteLine(“捕获的异常:\n”+e);
投
}
}
//.OuterXml似乎也能工作
公共字符串XmlToString(XmlDocument myxml)
{
StringWriter sw=新的StringWriter();
XmlTextWriter tx=新的XmlTextWriter(sw);
myxml.WriteTo(tx);
返回sw.ToString();
} 

@Michael Effraimidis:你的答案很好。如果需要xml声明,可以执行以下操作:

公共字符串XmlToString(XmlDocument myxml)
{
var memoryStream=新的memoryStream();
var xmlWriterSettings=new xmlWriterSettings{omitxmlsdeclaration=false};
var xmlWriter=xmlWriter.Create(memoryStream,xmlWriterSettings);
Save(xmlWriter);
返回UTF8Encoding.UTF8.GetString(memoryStream.ToArray());
} 

其他属性也可以通过XmlWriterSettings进行控制。请参阅。

我不熟悉在postgres中使用xml,但我不希望它知道如何使用XmlDocument之类的.NET类型。您可能需要获取它的OuterXml属性并将其放入数据库中,我想我已经修复了它。我使用公共字符串GetXMLAsString(XmlDocument myxml){StringWriter sw=new-StringWriter();XmlTextWriter tx=new-XmlTextWriter(sw);myxml.WriteTo(tx);return sw.ToString();}来获得正确的字符串。OuterXml似乎也可以正常工作。但是,从xml生成的字符串不包括以下行:“您认为这可能是个问题吗?我不能说这是否会是个问题,这取决于使用xml的内容。