Archive

Archive for April, 2006

Sage Data Objects for .NET

I’m working on a .NET wrapper for Sage Data Object (SDO).  This is my first (working) attempt at using the Sage code in .NET (C#) to import products.
 

Interop.SageDataObject111.SageDataObjects sdo = new Interop.SageDataObject111.SageDataObjects();

Interop.SageDataObject111.WorkSpace wsStock;

Interop.SageDataObject111.StockRecord srStock;

wsStock = sdo.GetWorkSpace();

string strACCData = @"C:Program FilesSageAccountsACCDATA";

wsStock.Connect(strACCData, "MANAGER", "", "ThisIsUnique");

srStock = (StockRecord)wsStock.CreateObject("StockRecord");

srStock.MoveFirst();

object objDescription = (object)"DESCRIPTION";

string strDescription = srStock.Fields.Item(ref objDescription).Value.ToString();

MessageBox.Show(strDescription);

wsStock.Disconnect();

 

Object model is still quite messy. Going to try to clean that up, and put some decent help files together.

Categories: Uncategorized

Making a server-side click work when Javascript is disabled

A client’s accessibility guidelines stipulated that a particular asp.net website was supposed to work, even when javascript was disabled. ASP.NET relies heavily on __doPostback to perform its postbacks, and thus all server-side links are disabled when JS is disabled.
 
So, I did a workaround, with a function that can modify an asp.net linkButton so that it will work – albeit in degraded mode when JS is disabled
 

public static void MakeNoJSSafe(LinkButton lb,string alternativeURL)

{

     string strJSLink = "javascript:__doPostBack(‘" + lb.ClientID + "’,”)";

     lb.Attributes.Add("onClick",strJSLink + ";this.href=’#’");

     lb.Attributes["href"] = alternativeURL;

     return;

}

 

For me, an hour of trial-and-error, for you, a minutes cut & paste.

Please credit me, if you use this script.

 

Categories: Uncategorized

Internet Voicemail service set live

Categories: Uncategorized

Extract email address with SQL UDF

This is a nice little user defined function that can extract email addresses from a block of text. I got the split function from planet-source-code, just to give credit where due.
 
CREATE FUNCTION dbo.Split(@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (Items nvarchar(4000))
AS
    BEGIN
    DECLARE @INDEX INT
    DECLARE @SLICE nvarchar(4000)
    — HAVE TO SET TO 1 SO IT DOESNT EQUAL Z
    —     ERO FIRST TIME IN LOOP
    SELECT @INDEX = 1
    — following line added 10/06/04 as null
    —      values cause issues
    IF @String IS NULL RETURN
    WHILE @INDEX !=0
        BEGIN 
         — GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
         SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
         — NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
         IF @INDEX !=0
          SELECT @SLICE = LEFT(@STRING,@INDEX – 1)
         ELSE
          SELECT @SLICE = @STRING
         — PUT THE ITEM INTO THE RESULTS SET
         INSERT INTO @Results(Items) VALUES(@SLICE)
         — CHOP THE ITEM REMOVED OFF THE MAIN STRING
         SELECT @STRING = RIGHT(@STRING,LEN(@STRING) – @INDEX)
         — BREAK OUT IF WE ARE DONE
         IF LEN(@STRING) = 0 BREAK
    END
    RETURN
END
CREATE FUNCTION get_email
 (  @TextContainingEmail varchar(1000)  )
RETURNS varchar(1000)
AS
BEGIN
 declare @retval varchar(1000)
 select top 1 @retval=items from dbo.split(@TextContainingEmail,’ ‘)
 where items like ‘%@%’
 return @retval
END
 
Then to use it, you can call
 
select dbo.get_email(‘my email address is bob@microsoft.com’)
 
 
Categories: Uncategorized

Export Google Search Results to CSV

I just wrote a handly function which uses the Google API to do a search, then export the results in CSV, for easy import into a database for further processing. Be aware, that this will probably max out your quota with one call, so be careful with it.
 

public void GoogleSearchToCSV(string SearchString, string FileName)

{

GoogleSearchService.GoogleSearchService gss = new GoogleSearchService.GoogleSearchService();

string CSV = "";

try

{

for(int i=170;i<10000;i+=10)

{

GoogleSearchService.GoogleSearchResult gsr = gss.doGoogleSearch("L3Pyyh5QFHKU740wXUu0/aBu17loGATB",SearchString,0,10,

false,"",false,"","","");

foreach(GoogleSearchService.ResultElement reSearch in gsr.resultElements)

{

CSV += reSearch.title.Replace(",","").Replace("n","") + ",";

CSV += reSearch.snippet.Replace(",","").Replace("n","") + ",";

CSV += reSearch.URL.Replace(",","").Replace("n","") + "n";

}

Debug.Write("Progress:" + i.ToString());

}

}

catch(Exception ex)

{

Debug.Write(ex.ToString());

}

FileStream fsOut = new FileStream(FileName,FileMode.Create);

StreamWriter swOut = new StreamWriter(fsOut);

swOut.Write(CSV);

fsOut.Close();

}

 
Categories: Uncategorized

Writing a C# Application without a user interface

I was looking to write a C# program which had no particular need for a user interface. My first stop was to develop a windows service, however, this proved too difficult to debug, so I decided to re-implement it as a windows forms app, with the form removed.
 
This application needed to poll a connection, every 5 seconds, and run idefinitely.
 

public System.Timers.Timer tmrPoll = new System.Timers.Timer();

[STAThread]

static void Main()

{

VoiceMailMain vmmInstance =

new VoiceMailMain();

vmmInstance.tmrPoll.Enabled =

true;

vmmInstance.tmrPoll.Interval = 5000;

vmmInstance.tmrPoll.Elapsed += new

System.Timers.ElapsedEventHandler(vmmInstance.tmrPoll_Tick);

System.Threading.Thread.CurrentThread.Suspend();

}

public

void tmrPoll_Tick(object sender, System.Timers.ElapsedEventArgs e)

{ … and magic happens … }

 

Simple when you know how!

 
Categories: Uncategorized

No mapping between account names and security IDs

Categories: Uncategorized

Uploading a file via a web service

When you think uploading files with a web service, you may immediately think about using DIME and WSE 2.0 etc. However, I believe there is an easier way – depending on your application, I presume, but this approach may be useful.
 
I wanted to be able to allow people use standard File upload from a webpage
<input type="file"> – and then have the output of this passed to a webservice. – Also, I wanted to do it generically, so that if an application were to consume the webservice, the developer would not have to figure out how to cast a stream to a HttpPostedFile class.
 
Therefore, I used a very simple technique, use a byte array as a parameter to the webMethod.
– I then wanted to save the byte array as a file, with a random name, in the same path as the webservice –

string strPath = HttpContext.Current.Request.ServerVariables["APPL_PHYSICAL_PATH"].ToString();

string strFileName = (Guid.NewGuid()).ToString()+".wav";

FileStream fsWave =

new FileStream(strPath + strFileName,FileMode.Create);

fsWave.Write(WaveData,0,WaveData.Length);

fsWave.Close();

 

Where WaveData was my Byte array.

 

Then when consuming this service, from an ASP.NET page, I used this code

HttpPostedFile hpfWave = this.AudioFile.PostedFile;

int intFileLen = hpfWave.ContentLength;

byte[] bWaveData = new byte[intFileLen];

hpfWave.InputStream.Read(bWaveData, 0, intFileLen);

strMessage = vmWebService.UploadAudio(bWaveData);

 

Where AudioFile is my Input type=file on the web page, and vmWebService was my webservice.

 

If you’re interested in knowing where this is leading, check out www.sms-txt.co.uk in a few days!

 

Categories: Uncategorized