C# 如何将XML文件插入列中

C# 如何将XML文件插入列中,c#,postgresql,C#,Postgresql,我正在尝试使用c#将一个用户配置文件设置xml(作为一个完整的文件放入xml数据类型的列)上传到我的postgres数据库中,下面是我的代码 var connstring = System.Configuration.ConfigurationManager.ConnectionStrings["pgcon"].ConnectionString; using (NpgsqlConnection conn = new NpgsqlConnection(connstring)) { con

我正在尝试使用c#将一个用户配置文件设置xml(作为一个完整的文件放入xml数据类型的列)上传到我的postgres数据库中,下面是我的代码

var connstring = System.Configuration.ConfigurationManager.ConnectionStrings["pgcon"].ConnectionString;

using (NpgsqlConnection conn = new NpgsqlConnection(connstring))
{
    conn.Open();

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("G:\\new repo\\setting xmls\\settings.xml");
    //workinq query insert
    //  string sql2 = string.Format(@"INSERT INTO Public.""UserDetails"" (id, usercode, address) VALUES ('dd', 'code', '1001')");

    NpgsqlCommand dbcmd = conn.CreateCommand();
    try
    {                       
        string sql = string.Format("SET SEARCH_PATH to Public;");                          
        string sql0 = string.Format(@"INSERT INTO Public.""UserProfile"" (setting, userstatus, userstatusdescription, id) VALUES ('{0}', true, 'active', 'ddd');", xmlDoc);

        dbcmd.CommandText = sql + sql0;
        dbcmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        throw;
    }
}
但是,它正在上传为表中的
System.Xml.XmlDocument
,我需要将其另存为Xml


如有任何帮助,我们将不胜感激。

如评论中所述,您可以执行以下操作

string myXml = XDocument.Load("G:\\new repo\\setting xmls\\settings.xml").ToString()
然后


请使用@ahammadalipk,因为这最初是为了解决OP的XML上传问题而发布的@AMMADALIPK答案涵盖了OP在Sql注入方面遇到的问题,如评论中所述,您可以执行以下操作

string myXml = XDocument.Load("G:\\new repo\\setting xmls\\settings.xml").ToString()
然后


请使用@ahammadalipk,因为这最初是为了解决OP的XML上传问题而发布的@ahammadalipk答案涵盖了OP在Sql注入中遇到的问题,以避免问题小BOBBY表(当xml数据包含单引号和注入错误时出错),您可以使用
npgsqlparmeter
类,而不是直接在查询中添加参数

而不是这个,

string sql0 = string.Format(@"INSERT INTO Public.""UserProfile"" (setting, userstatus, userstatusdescription, id) VALUES ('{0}', true, 'active', 'ddd');", myXml);
这样做,

NpgsqlParameter p = new NpgsqlParameter("@myXml", NpgsqlTypes.NpgsqlDbType.Xml);
                    p.Value = myXml;  
完整的代码

 using (NpgsqlConnection conn = new NpgsqlConnection(connstring))
            {
                conn.Open();    
                string myXml = XDocument.Load("G:\\new repo\\setting xmls\\settings.xml").ToString();                     
                NpgsqlCommand dbcmd = conn.CreateCommand();
                try
                {

                    string sql = string.Format("SET SEARCH_PATH to Public;");                     
                    string sql0 = string.Format(@"INSERT INTO Public.""UserProfile"" (setting, userstatus, userstatusdescription, id) VALUES (@myXml, true, 'active', 'ddd');");                    
                    dbcmd.CommandText = sql + sql0;
                    NpgsqlParameter p = new NpgsqlParameter("@myXml", NpgsqlTypes.NpgsqlDbType.Xml);
                    p.Value = myXml;                   
                    dbcmd.Parameters.Add(p);
                    dbcmd.ExecuteNonQuery();

                }
                catch (Exception ex)
                {

                    throw;
                }



            } 

快乐编码!对于后来者。

为了避免这个问题小鲍比桌(当xml数据包含单引号和注入错误时出错),您可以使用
npgsqlparmeter
类,而不是直接在查询中添加参数

而不是这个,

string sql0 = string.Format(@"INSERT INTO Public.""UserProfile"" (setting, userstatus, userstatusdescription, id) VALUES ('{0}', true, 'active', 'ddd');", myXml);
这样做,

NpgsqlParameter p = new NpgsqlParameter("@myXml", NpgsqlTypes.NpgsqlDbType.Xml);
                    p.Value = myXml;  
完整的代码

 using (NpgsqlConnection conn = new NpgsqlConnection(connstring))
            {
                conn.Open();    
                string myXml = XDocument.Load("G:\\new repo\\setting xmls\\settings.xml").ToString();                     
                NpgsqlCommand dbcmd = conn.CreateCommand();
                try
                {

                    string sql = string.Format("SET SEARCH_PATH to Public;");                     
                    string sql0 = string.Format(@"INSERT INTO Public.""UserProfile"" (setting, userstatus, userstatusdescription, id) VALUES (@myXml, true, 'active', 'ddd');");                    
                    dbcmd.CommandText = sql + sql0;
                    NpgsqlParameter p = new NpgsqlParameter("@myXml", NpgsqlTypes.NpgsqlDbType.Xml);
                    p.Value = myXml;                   
                    dbcmd.Parameters.Add(p);
                    dbcmd.ExecuteNonQuery();

                }
                catch (Exception ex)
                {

                    throw;
                }



            } 

快乐编码!对于后来者。

请尝试
string myXml=XDocument.Load(“G:\\new repo\\setting xmls\\settings.xml”)。ToString()
非常感谢,它工作正常。但还有一个问题,如果我的xml在一些标记中只有一个引号,它就会再次失败。就像这本XML开发者指南一样,我很高兴能帮上忙。我将把它作为一个答案写下来,这样对未来的读者会有帮助。请尝试
string myXml=XDocument.Load(“G:\\new repo\\setting xmls\\settings.xml”)。ToString()
非常感谢,它工作得很好。但还有一个问题,如果我的xml在一些标记中只有一个引号,它就会再次失败。就像这本XML开发者指南一样,我很高兴能帮上忙。我会把它作为一个答案写下来,这样对未来的读者有帮助。小鲍比桌子@UweKeim想解释一下是的,有这个问题,如果我们在xml中有一个单引号,它可能会假设我们的sql查询已经结束。您能解释一下如何避免这种情况吗?您能提供一个XML文档的小片段吗@UweKeim想解释一下是的,有这个问题,如果我们在xml中有一个单引号,它可能会假设我们的sql查询已经结束。你能解释一下如何避免这种情况吗?你能提供一个XML文档的小片段吗