Набор данных ASP .NET в XML: хранение и чтение - PullRequest
1 голос
/ 09 июля 2010

[Ниже приведен почти полный измененный код. В настоящее время показывает недопустимую ошибку символа при чтении].

У меня есть приложение на C # ASP.NET, которое в настоящее время читает файл XML из файловой системы и затем загружает его в элемент управления GridView. В сетке я могу удалить строки. Под сеткой также есть кнопка загрузки файла, которая загружает файлы PDF, и они отображаются в сетке. Мой код в основном модифицированная версия этот код

Следующим этапом моей работы является чтение данных XML как String из поля базы данных, а не из файла XML. Для этого, я думаю, я могу начать с простого чтения из XML-файла, внесения изменений на странице aspx и записи «набора данных» в поле базы данных «PDF_Storage». Как мне это сделать. Крайне важно, мне нужно иметь возможность преобразовать набор данных в какой-то формат строки для хранения. Вот мой фрагмент кода.

Моя база данных - Oracle 10, но я могу выяснить синтаксис Update sql.

ОБРАЗЕЦ ФАЙЛА XML:

 <DataSet>
    <PDF>
        <pdf>MyPDF1.pdf</pdf>
    </PDF>
    <PDF>
        <pdf>MyPDF2.pdf</pdf>
    </PDF>
    <PDF>
        <pdf>MyPDF3.pdf</pdf>
    </PDF>
</DataSet>

и соответствующий код:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Oracle.DataAccess.Client;
using System.Web.Configuration;
using System.IO;
using System.Xml;
using System.Text.RegularExpressions;

public partial class XMLGridTest : System.Web.UI.Page
{
    public static string GetConnString()
    {
        return WebConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            binddata();
        }
    }
    void binddata()
    {
        DataSet ds = new DataSet();
      // ds.ReadXml(Server.MapPath("testxml.xml"));
        String strConnect = GetConnString();
        OracleConnection oracleConn = new OracleConnection();
        oracleConn.ConnectionString = strConnect;
        oracleConn.Open();
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = oracleConn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT PDF_Storage FROM CampusDev.CU_POLY WHERE OBJECTID = " + Request.QueryString["OBJECTID"];
        OracleDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            if (!reader.IsDBNull(0))
            {


              //## Line Below as the 'illegal characters' problem###
               ds.ReadXml(reader[0].ToString(), XmlReadMode.IgnoreSchema);
                 gv.DataSource = ds;
                gv.DataBind();

            }
            else
            {
                // Response.Write(reader.GetString(1));
                // TextBox1.Text = reader.GetString(1);
            }
        }
       // gv.DataSource = ds;//##Hard coded for XML. Works!
       //  gv.DataBind();

        //Finally, close the connection
        oracleConn.Close();


    }

    protected void Canceldata(object s, GridViewCancelEditEventArgs e)
    {
        gv.EditIndex = -1;
        binddata();
    }

    protected void pageddata(object s, GridViewPageEventArgs e)
    {
        gv.PageIndex = e.NewPageIndex;
        binddata();
    }

    protected void insert(object sender, EventArgs e)
    {
        /////////////////////////////////File Upload Code/////////////////////////////////
        // Initialize variables
        string sSavePath = "ParcelPDF/"; ;
        if (fileupload.PostedFile == null)
        {
            Label1.Text = "Must Upload a PDF file!";
            return;
        }
        HttpPostedFile myFile = fileupload.PostedFile;
        int nFileLen = myFile.ContentLength;

        // Check file extension (must be JPG)
        if (System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".pdf")
        {
            Label1.Text = "The file must have an extension of .pdf";
            return;
        }
        // Read file into a data stream
        byte[] myData = new Byte[nFileLen];
        myFile.InputStream.Read(myData, 0, nFileLen);
        // Make sure a duplicate file doesn’t exist.  If it does, keep on appending an incremental numeric until it is unique
        string sFilename = System.IO.Path.GetFileName(myFile.FileName);
        int file_append = 0;
        while (System.IO.File.Exists(Server.MapPath(sSavePath + sFilename)))
        {
            file_append++;
            sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) + file_append.ToString() + ".pdf";
        }

        // Save the stream to disk
        System.IO.FileStream newFile = new System.IO.FileStream(Server.MapPath(sSavePath + sFilename), System.IO.FileMode.Create);
        newFile.Write(myData, 0, myData.Length);
        newFile.Close();
        binddata();
        DataSet ds = gv.DataSource as DataSet;
        DataRow dr = ds.Tables[0].NewRow();
        // dr[0] = pdf.Text;
        dr[0] = sFilename.ToString();
        ds.Tables[0].Rows.Add(dr);
        ds.AcceptChanges();
        string blah = "blah";
        Response.Write(ds.Tables.ToString());
        //  ds.WriteXml(Server.MapPath("testxml.xml"));
        String strConnect = GetConnString();
        OracleConnection oracleConn = new OracleConnection();
        oracleConn.ConnectionString = strConnect;
        oracleConn.Open();
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = oracleConn;
        cmd.CommandType = CommandType.Text;
        // cmd.CommandText = "SELECT OBJECTID,COMMENTS FROM CampusDev.CU_POLY WHERE OBJECTID = " + Request.QueryString["OBJECTID"];
        cmd.CommandText = "UPDATE CampusDev.CU_POLY SET PDF_Storage = :PDF_Storage WHERE OBJECTID = " + Request.QueryString["OBJECTID"];
        StringWriter SW = new StringWriter();
        ds.WriteXml(SW);
        cmd.Parameters.Add(":PDF_Storage", SW.ToString());
        cmd.ExecuteNonQuery();
        oracleConn.Close();
        binddata();
    }

    protected void Deletedata(object s, GridViewDeleteEventArgs e)
    {
        binddata();
        DataSet ds = gv.DataSource as DataSet;
        ds.Tables[0].Rows[gv.Rows[e.RowIndex].DataItemIndex].Delete();
        //  ds.WriteXml(Server.MapPath("testxml.xml"));//Disabled now. Do database. Irfan. 07/09/10
        String strConnect = GetConnString();
        OracleConnection oracleConn = new OracleConnection();
        oracleConn.ConnectionString = strConnect;
        oracleConn.Open();
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = oracleConn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "UPDATE CampusDev.CU_POLY SET PDF_Storage = :PDF_Storage WHERE OBJECTID = " + Request.QueryString["OBJECTID"];
        StringWriter SW = new StringWriter();

        ds.WriteXml(SW,XmlWriteMode.IgnoreSchema);
        Regex regex = new Regex(@"(\r\n|\r|\n)+");
        string newText = regex.Replace(SW.ToString(), "");
        cmd.Parameters.Add(":PDF_Storage", newText);
        cmd.ExecuteNonQuery();
        oracleConn.Close();
        binddata();
        string blah = "blah";
    }

1 Ответ

0 голосов
/ 09 июля 2010

Вот как я делал это в прошлом.Для вставки вы можете просто записать XML-представление набора данных в строку и сохранить его непосредственно в поле в базе данных.В этом случае я использовал Sql Server 2008 и тип данных XML для поля базы данных.Я думаю, что тип данных в Oracle является XMLTYPE.

Вставка:

public static void InsertDataSet(string key, DataSet dataSet)
{
  string xml = string.Empty;

  using (MemoryStream ms = new MemoryStream())
  {
    dataSet.WriteXml(ms, XmlWriteMode.WriteSchema);

    ms.Position = 0;

    using (StreamReader sr = new StreamReader(ms))
    {
      xml = sr.ReadToEnd();
    }

    using (SqlServerConnection c = new SqlServerConnection(connectionString))
    {
      c.command.CommandType = CommandType.StoredProcedure;
      c.command.CommandText = "some stored procedure to do the insert";
      c.command.Parameters.Clear();

      c.command.Parameters.Add(new SqlParameter("@key", key));
      c.command.Parameters.Add(new SqlParameter("@xml", xml));

      c.command.ExecuteNonQuery();
    }
  }
}

Получить набор данных из базы данных так же просто, как прочитать данные XML изобратно в TextReader, а затем создайте новый DataSet.

Получить:

public static DataSet GetDataSet(string key)
{
  using (SqlServerConnection c = new SqlServerConnection(connectionString))
  {
    c.command.CommandType = CommandType.StoredProcedure;
    c.command.CommandText = "some stored procedure to get the xml";
    c.command.Parameters.Clear();

    c.command.Parameters.Add(new SqlParameter("@key", key));

    dr = c.command.ExecuteReader();

    if (dr == null)
    {
      return null;
    }

    if (dr.HasRows)
    {
      while (dr.Read())
      {
        if (dr["xml_field"] != DBNull.Value)
        {
          TextReader tr = new StringReader(dr["xml_field"].ToString());

          result = new DataSet();
          result.ReadXml(tr, XmlReadMode.ReadSchema);
        }
      }
    }
  }

  return result;
}

Надеюсь, что это поможет.

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