martedì 7 febbraio 2012

Ignore inline DTD in XML file with LINQ to XML

If we want to read an XML file with LINQ to XML that have DTD inline instructions, normally we use this statement

    XDocument doc = XDocument.Load("myXmlFile.xml");

but... we'll receive an exception.

The Load method of the XDocument has several overloads, including one in particular that takes as a parameter an XmlReader object.
Let's see how to use it:

  XmlReaderSettings settings = new XmlReaderSettings();
  settings.DtdProcessing = DtdProcessing.Ignore;
  XmlReader reader = XmlReader.Create("myFile.xml", settings);
  XDocument doc = XDocument.Load(reader,   LoadOptions.PreserveWhitespace);

First, create a XmlReaderSettings object and set its DtdProcessing property to "Ignore". It causes the DOCTYPE element to be ignored.
Then, create a new XmlReader object using the file path name and XmlReader previously created settings.
Now we can open without previous exception out xml file, passing XmlReader object as argument of XDocument Load method.

lunedì 16 gennaio 2012

EntityDataSource and isolation level.

Suppose we have a asp.net page and display some data from a database table in a GridView. The latter is connected to EntityDataSource.
If we are running a long elaboration on that table (as an update or other processing), the page containing the data to show cannot hang and display our data until processing is finished.
That's not ever that we want....

Probably this behavior is not what we want. How can we solve it?

Using EntityDataSource ContextCreated event we can "attach" a transaction to the ObjectContext used by datasource.

protected void MyEntityDataSource_ContextCreated(object sender, EntityDataSourceContextCreatedEventArgs e) {
        e.Context.Connection.Open();
        e.Context.Connection.BeginTransaction(IsolationLevel.ReadUncommitted);
}

First we have to manually open the database connection. Then, start a database transaction specifying the isolation level we want to use. In this case, we need "ReadUncommitted" so we can read all data from database, including those not yet committed (dirty).

giovedì 17 novembre 2011

Trace T-SQL statements generated by Entity Framework

If we want to keep track of a query with Entity Framework without use a profiler, we can use the method ToTraceString which is part of the ObjectQuery object. In practice, this method displays the commands sent from our T-SQL query to the database.

First, when using the ToTraceString method we need an open connection to the database, otherwise we will raise an exception.

Its use is very simple. Here an example:
using (MyEntities ctx= new MyEntities()) {
  var strSql = "SELECT VALUE t FROM MyEntities.Employees AS t";
  var myQuery = ctx.CreateQuery(strSql);
 
  ctx.Connection.Open();
 
  Console.WriteLine(myQuery.ToTraceString());
  Console.ReadLine();
}


The output will be something like:
SELECT
[it].[FirstName] AS [FirstName],
[it].[LastName] AS [LastName],
[it].[Age] AS [Age]
FROM [dbo].[Employees] AS [it]

One important thing about ToTraceString method is that it doesn’t execute the query but it's only output the statement to be executed.

domenica 24 luglio 2011

Layout for multiple file upload with jQuery

Within forms, many times we need to empower users to enter one or more files. In some cases you may need to perform the upload of multiple files, without knowing in advance how they might be.
Limit the number of inputs for uploading files is sometimes not the best choice, so we could give the user a chance to put other files in his complete autonomy.

This post explains how to use jQuery without any plugins for creating html for inserting multiple fileupload.

We start from a simple html page that contains only those elements essential for this application:


<!DOCTYPE html>
<html>
<head>
    <title>Multiupload file</title>
    <script type="text/javascript" src="Scripts/jquery-1.6.2.min.js"></script>
    <script type="text/javascript" src="Scripts/JScript.js"></script>
</head>
<body>
      
    <div class="container">
        <button id="btAddFileUpload" type="button">Add file</button>
        <div id="fileUp1">
            <input id="File1" type="file" />
            <button id="btDelete1" type="button" value="1" onclick="javascript:deleteUpload(value)">Delete</button>        
        </div> 
      
        <input id="Submit1" type="submit" value="Submit" />
    </div>
  
</body>
</html>
 

I copied into my "Scripts" directory latest jQuery library version, but you can refer it in the classic mode by Google:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>

I wrote my JavaScript code in an external file called "JScript.js" and referenced in html script tag. This is the code:

$(document).ready(function () {
    $('#btAddFileUpload').click(add);
});

//upload file tags counter
var count = 1;


//add fileupload method
function add() {

    //upload file tags increase
    count++;   
   
    //clone div tag with all children elements
    var copied = $('#fileUp1').clone(true);

    //increase all children tags ids
    $('input:file', copied).attr('id', 'File' + count);
    $('button', copied).attr(
        { id: 'btDelete' + count,
          value: count
        }
    );

    //increase div tag id
    $(copied).attr('id', 'fileUp' + count);

    /* another mode to change attribute names
    copied.children('input').attr('id', 'File' + count);
    copied.children('button').attr('id', 'btDelete' + count);
    */

    //append copied div and relative children tags in container div, but before submit button
    $(copied).appendTo('.container').insertBefore('#Submit1');
}


//delete method fileupload method
function deleteUpload(id) {

    //remove file upload (parent div and childrens)
    if (count > 1) {

        //decrease total amount of uploadfile tags
        count--;

        var nameElemToDelete = '#fileUp' + id;
        $(nameElemToDelete).remove();
    }


    //to avoid holes, recalculating all the ids after the removed one
    for (indx = id; indx <= count; indx++) {
           
        var inputDiv = $('#fileUp' + (parseInt(indx) + 1));
        $(inputDiv).attr('id', 'fileUp' + indx);
       
        $('input:file', inputDiv).attr('id', 'File' + indx);
        $('button', inputDiv).attr(
            { id: 'btDelete' + indx,
              value: indx
            }
        );
    }
}




At the begin, I call the $(document).ready jQuery statement to join the add function to add button at the startup (page entirely loaded).
Each time you click on the button "btAddFileUpload", all you clone the "
" tag including its children, renaming the id attributes with a new name including the number increases by one.
All this is done using the jQuery methos "clone" on an object (tag) that you want to replicate. 


With "deleteUpload" function you can delete the same tag (and all its childrens) and recalculate all ids to avoid holes. This was done to iterate over all the inputs file without any problems.