繁体   English   中英

如何在C#中从SQL Server 2005检索xml?

[英]How to retrieve xml from SQL Server 2005 in C#?

我已经通过富文本字段成功地将xml插入SQL Server 2005,现在我要做的是从数据库中检索xml,但将值和模式分别分开...如何在现有代码中做到这一点?

public void setData()
{
   dc.ID = textBox1.Text;
   dc.Name = richTextBox1.Text;
}

private void button1_Click(object sender, EventArgs e)
{
    setData();

    int flag = db.InsertData("insert into xmlTB values('" + dc.ID + "','" + dc.Name + "')");
    if (flag > 0)
       MessageBox.Show("Record Added");
    else
       MessageBox.Show("Not Added");

    try
    {
    }
    catch (Exception ex) 
    {
        MessageBox.Show(ex.Message);
    }
}

其余的插入代码位于单独的类中:

public SqlConnection conn = new SqlConnection("Data Source=SERVER1\\SQLEXPRESS;Initial Catalog=xml;Integrated Security=True;Pooling=False");

public int flag = 0;
public SqlDataReader sdr = null;
public DBConnection() { } // constructor

public int InsertData(string qry)
{
     try
     {
          conn.Open();
          SqlCommand cmd = new SqlCommand(qry, conn);
          flag = cmd.ExecuteNonQuery();
          conn.Close();
          return flag;
      }
      catch (Exception)
      {
          return flag;
      }
 }

非常感谢

您肯定应该开始使用的几件事:

  • 使用参数化查询将值插入表中
  • 在INSERT语句中使用特定的列列表 -否则,下次表更改时,INSERT将失败

今天的操作方式既脆弱又脆弱,并且在表更改时会破裂,再加上SQL命令的连接,这是进行SQL注入攻击的绝佳机会。 只是不要那样做!

因此,您的第一种方法应如下所示:

private void button1_Click(object sender, EventArgs e)
{
    setData();

    string query = "INSERT INTO dbo.xmlTB(ID, Name) VALUES(@ID, @Name)";

    int flag = db.InsertData(query, ...(somehow pass in the parameters!.....);
    ......    
}

其次,第二种方法应该

  • 使用using(....) { ... }结构来保护和处置您的SqlConnectionSqlCommand对象实例
  • 确实要从数据库中检索XML,请使用简单的SELECT查询并在SqlCommand对象上调用ExecuteReaderExecuteScalar

像这样:

public string ReadXmlData(int ID)
{
   string query = "SELECT XmlContent FROM dbo.xmlTB WHERE ID = @ID";
   string connectionString = "Data Source=SERVER1\\SQLEXPRESS;Initial Catalog=xml;Integrated Security=True;Pooling=False";

   using(SqlConnection conn = new SqlConnection(connectionString))
   using(SqlCommand cmd = new SqlCommand(query, conn))
   {
      cmd.Parameters.Add("@ID", SqlDbType.Int);
      cmd.Parameters["@ID"].Value = ID;

      conn.Open();
      string xmlContents = cmd.ExecuteScalar().ToString();
      conn.Close();

      return xmlContents;
   }
   catch (Exception)
   {
       return flag;
   }
}

这个问题看起来很模糊,但是:在添加记录后,调用另一个称为“ GetData”的方法(您需要编写此方法)。 此方法可能使用cmd.ExecuteReader()来调用数据库。 确保查询中的select语句在表名的末尾具有“ FOR XML”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM