What causes "ASP 0248" error? - asp-classic

I get this really bizarre error:
0x80004005 - Object ObjectContext: 006~ASP 0248~Script isn't transacted. This ASP file must be transacted in order to use the ObjectContext object.
In some cases. I have old ASP pages that call several libraries, one of which does this:
IF blnHasError THEN
ObjectContext.SetAbort
ELSE
ObjectContext.SetComplete
END IF
Which is where the error occurs. But given the obscure error message, I can't figure out what ASP wants or expects.

The calling page must be transacted, meaning that in its header it must declare this:
<%# Transaction=Required %>
More documentation here.

Related

Classic ASP and Signature Pad ADODB.Stream error '800a0bb9'

Using code for saving signature to file from this post
get error on line
bStream.Write( nodeB64.NodeTypedValue )
ADODB.Stream error '800a0bb9'
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
Using local server win 7 ultimate and classic asp.
Tried many different solutions but no luck.
Fix it. forgot to add the right jquery js and css head of my page.

Int32 parse not finding object in asp

I have the follow asp file:
<H3>test file</H3>
<%
s = "1"
a = Int32.Parse(s)
%>
and I get the following error:
test file
Microsoft VBScript runtime error '800a01a8'
Object required: ''
/ignore/testInt32.asp, line 4
I suspect I am missing an include, but I can not find any example that has an include.
Are you sure you are using classic asp. I looked this up because I though
Int32.Parse()
was a bit strange. As far as I can tell that is a ASP.NET only function. for classic asp you should use
CInt()
Edit: Just wanted to update my answer a bit. While the above line would give you no issue in your example, in order to make sure the code exactly matches what your original code would do, you should instead use
CLng()
CLng will overflow after ~2 million the same as Int32. CInt on the other hand CInt will overflow after ~30k. Either way for classic asp you should use one of those two.
Why did you get an Object Required Error?
The issue is your mixing asp.net objects with asp-classic which out of the box Classic ASP (by default vbscript) doesn't know about.
The fact a line number is included should lead to the cause of the problem fairly quickly.
Microsoft VBScript runtime error '800a01a8'
Object required: ''
/ignore/testInt32.asp, line 4
on line 4 which will be;
a = Int32.Parse(s)
An Object is required error occurs because Int32 is not a valid "Object Reference" as far as VBScript is concerned. There is no built-in Objects called Int32 and there is no instantiation of an Int32 Object Reference using code like;
Set Int32 = Server.CreateObject("TheObjectsProgID")
Solution
If you want to parse an Long data type in VBScript as #KHeaney has suggested you should be using
a = CLng(s)
VBScript is Typeless so Check Your Variables
Be aware that if the value of s is not a valid numeric value you conversion will fail and you will receive a
Microsoft VBScript runtime error '0x800a000d'
Type mismatch: 'CLng'
There are various ways to get around this including using Val() which will return non numeric conversions as 0 (this can be dangerous). Another approach is to check the value beforehand using something like;
If IsNumeric(s) Then a = CLng(s) Else a = 0
You don't have to set a = 0 this can be any assignment a = "" is also possible, the fact is checking the variable like this gives you greater control over the outcome.
Useful Links
CLng() Function
VBScript Data Types

When is System.Convert.FromBase64String() implicitly called?

I'm getting an Invalid length for a Base-64 char array error, but it's not my code and I don't see any explict references to this function. I know that it could be a problem with the ViewState or a '+' decoding problem with Request.QueryString, but is there anything else where something is being implicitly converted to Base 64?
Edit: I'm just given a bunch of code and an exception message pointing to some pages, so I'm looking for absolutely anything related that could be suspicious - but I don't know what those look like. No debug privilages either so I have to just scan through and make guesses.
You need to use the debugger to find out exactly which line is causing the error. You can find this out by having the debugger break whenever an exception is thrown in your code. Do the following within Visual Studio (I am showing Visual Studio 2012):
Click the Debug menu.
Choose Exceptions...
You will now see the following:
As the picture shows, make sure the Thrown checkbox is checked for Common Language Runtime Exceptions.
Click OK and the next time you run your code, the debugger should halt at the line that is causing the Invalid length for a Base-64 char array error.

SqlDataSource erroring when retrieving NVARCHAR(max) column

I'm writing a small ASP .Net application in order to retrieve data from a SQL database. The application uses drop downs in order to select what the next drop down should contain and when a page is selected, it should retrieve the HTML from the database. Everything is working until it gets to the retrival of the HTML data. When I try to retrieve the data, I get:
Microsoft JScript runtime error:
Sys.WebForms.PageRequestManagerServerErrorException:
An unknown error occurred while
processing the request on the server.
The status code returned from the
server was: 500
The HTML column is a defined as NVARCHAR(MAX), but I can't see this causing a problem. The application works if I set the DataValueField to another column. Has one else come across a problem like this? Maybe someone could shine some light on this?
One thing I noted when dealing with varchar(max) columns is that the framework still commonly expects to have a size associated with it. What I ended up having to do was specify the length as -1 to get it to accept a varchar(max) field. Your error message doesn't indicate that this is the problem, but you might try experimenting with it rather than turning off the validation, which could possibly have other repercussions.
Figured it out. Just needed to set ValidateRequest to false at the Page level.

When am I able to access the ASPError object?

I've begun using ASPUnit to unit test my classic ASP code. This is all good and I'm happy. The only problem is with the error messages it displays when a test generates a runtime error. For example, if I've not defined a variable somewhere in my function I get the error:
Microsoft VBScript runtime error (500): Variable is undefined
What would be more useful is if it could tell me which file/line the error occurred on. I know that I can get this information from the ASPError object which is returned by the Server.GetLastError() and elsewhere in my project I have a custom 500 error page which makes use of this method to automatically report crashes to Fogbugz. However when I try to access Server.GetLastError anywhere else the information returned is blank. For example, the following code will output zero rather than the expected 4.
<%
Option Explicit
On Error Resume Next
aVariable = "hello"
Dim errObj : Set errObj = Server.GetLastError()
Response.Write errObj.Line
%>
Is this the correct way to access ASPError or is it only possible on custom error pages? Is there a better way to get error messages reported within ASPUnit?
To the best of my knowledge the ASPError object does not get populated until your current page finished processing. Its meant to only be used on the 500 error page only. So theory is when you get an error if you've set up your 500 page then IIS will do an internal redirect to that page to allow you to at least record the error. Then and only then is the ASPError object available. I've had crazy ideas of using a xmlhttprequest to try to grab the page but thats just not the way it works.
In short there is not much you can do to get that error message details that you want.
Using JScript server side you can use try catch's which give you access to a exception object but even thats not much good to you, no line numbers or anything. Rubbish.

Resources