Thursday, 24 February 2011

Cross Browser XHR

This works on all popular browsers ...

function sendRequest(url,callback,postData) {
var req = createXMLHTTPObject();
if (!req) return;
var method = (postData) ? "POST" : "GET";
req.open(method,url,true);
req.setRequestHeader('User-Agent','XMLHTTP/1.0');
if (postData)
req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
req.onreadystatechange = function () {
if (req.readyState != 4) return;
if (req.status != 200 && req.status != 304) {
return;
}
callback(req);
}
if (req.readyState == 4) return;
req.send(postData);
}

var XMLHttpFactories = [
function () {return new XMLHttpRequest()},
function () {return new ActiveXObject("Msxml2.XMLHTTP")},
function () {return new ActiveXObject("Msxml3.XMLHTTP")},
function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
var xmlhttp = false;
for (var i=0;i
try {
xmlhttp = XMLHttpFactories[i]();
}
catch (e) {
continue;
}
break;
}
return xmlhttp;
}

call with ....

sendRequest('a-page.aspx',myCallback,"");




Data Layer Without Linq

A good n-tiered approach is to create a [ProjectName].Data class library.
Create a base class.

public class SqlDataCaller
{
private static SqlConnection getConnection()
{
return new SqlConnection(
ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
}

protected static DataSet ExecuteSPDataSet(String spName, SqlParameter[] parameters)
{
DataSet ds = new DataSet();

using (SqlConnection connection = getConnection())
{
try
{
connection.Open();
}
catch (SqlException ex)
{
throw ex;
}

SqlDataAdapter da = new SqlDataAdapter(spName, connection);
da.SelectCommand.CommandType = CommandType.StoredProcedure;

if (parameters != null)
da.SelectCommand.Parameters.AddRange(parameters);

try
{
da.Fill(ds);
}
catch (SqlException ex)
{
throw ex;
}

connection.Close();
}
return ds;
}
}

Then in their own namespaces, create classes to pass a DataTable to the business objects.

namespace [Project Name].Data.People
{
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Text;

using [Project Name].Data.Base;

///
/// Class responsible for all data access regarding people
///
public class PeopleDAC : SqlDataCaller
{
public const String ColName_PersonId = "PersonId";
public const String ColName_Name = "Name";
public const String ColName_Region = "RegionName";
public const String ColName_DateTime = "TimeDateStamp";

public static DataTable GetPerson(Int32 personId)
{
String spName = "example_GetPerson";

SqlParameter[] parameters = new SqlParameter[1];

parameters[0] = new SqlParameter("@PersonId", SqlDbType.Int, 4);
parameters[0].Value = count;

DataSet ds = ExecuteSPDataSet(spName, parameters);

return ds.Tables[0];
}
}
}