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

时间:2010-11-20 11:24:11

标签: c# xml sql-server-2005

我已成功通过富文本字段将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;
      }
 }

非常感谢

2 个答案:

答案 0 :(得分:2)

你应该开始使用的几件事情:

  • 使用参数化查询将值插入表格
  • 在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查询并在ExecuteReader对象上调用ExecuteScalarSqlCommand

这样的事情:

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;
   }
}

答案 1 :(得分:1)

这个问题显得含糊不清但是:在添加了记录之后,调用另一个名为“GetData”的方法(你需要写这个)。此方法可能使用cmd.ExecuteReader()来调用db。确保查询中的select语句在表名末尾有“FOR XML”。