2010-11-20 10 views
1

Zengin metin alanı aracılığıyla SQL Server 2005'e xml ekledim, şimdi ne yapmak istediğim DB'den xml almak ama ayrı ayrı değerler ve şema ayırmak ... bunu varolan kodumda nasıl yapabilirim ??C# SQL Server 2005'ten xml nasıl alınır?

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

çok teşekkürler

cevap

2

Birkaç şey:

  • kullanımını
  • sizin INSERT deyimi sütunların belirli listesini kullanmak için tablolarına değerlerin yerleştirilmesine yarayan sorgular parametrelenmişse - aksi bir dahaki sefere o tablo değişiklikleri, INSERT başarısız olacaktır

Bugün yaptığınız yöntem hem kırılgan hem de kırılgandır ve tablonuz bozulur değişiklikler, artı SQL komutunuzun bir araya getirilmesi SQL enjeksiyon saldırıları için harika bir fırsattır. Sadece böyle yapma!

Yani ilk yöntem şöyle görünmelidir:

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!.....); 
    ......  
} 

İkinci olarak, ikinci yöntem

  • sizin SqlConnection ve SqlCommand nesne örneklerini korumak ve imha etme using(....) { ... } yapıları kullanmalıdır
  • XML veritabanından almak, basit bir SELECT sorgusu kullanın veüzerinde ExecuteReader veya ExecuteScalar arayınnesnesi. Böyle

şey:

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

soru muğlak görünen ama: rekor katma sonra "GetData demek denilen başka bir yöntemi çağırmak ekleme kodu kalır

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

ayrı sınıfta "(bunu yazmanız gerekecek). Bu yöntem db'yi çağırmak için cmd.ExecuteReader() kullanabilir. Sorgunuzdaki select ifadenizin, tablo adının sonunda "FOR XML" olduğundan emin olun. kesinlikle kullanmaya başlamak gerekir

+0

u fonk yazabilir ?? benim Q'm örneğin. xml hi'dur ....................... bu yüzden john gösterir – salman

+0

"hi" nereden geliyor? Bu, sorunuzda belirtilen ad veya kimlik değildir. – CarneyCode

+0

tamam bırakın hi bir ??? – salman