Как получить XML из SQL Server 2005 в C #? - PullRequest
1 голос
/ 20 ноября 2010

Я успешно вставил 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 ]

2 голосов
/ 20 ноября 2010

Несколько вещей, которые вы обязательно должны начать использовать:

  • использовать параметризованные запросы для вставки значений в ваши таблицы
  • используйте определенный список столбцов в вашем операторе 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(....) { ... } для защиты и утилизации ваших SqlConnection и SqlCommand экземпляров объектов
  • извлекайте XML из базы данных, используйте простой запрос SELECT и вызывайте ExecuteReader или ExecuteScalar для вашего SqlCommand объекта.

Примерно так:

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 голос
/ 20 ноября 2010

Вопрос выглядит расплывчатым, но: после добавления записи вызовите другой метод с именем say «GetData» (вам нужно написать это). Этот метод может использовать cmd.ExecuteReader () для вызова БД. Убедитесь, что в вашем операторе select в вашем запросе в конце имени таблицы указано «FOR XML».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...