I intend to use session variable to capture searching keywords and catagory input by user. I created datatable dTable to store "catagory", "keyword" and "ID" and save it into session variable session("MyCat") when page is firstly loaded.
If it is still within same session time frame, any new input will be automatically added into this datatable and session variable updated as well.
Anyway, my program can not get through as it is captured error in
dim dr as DataRow=dTable.NewRow() in my else statement.
May I know what is wrong with my coding in Sub Submit portion and how this can be implemented efficiently in ASP.NET?


<%@ Page Language="VB" EnableSessionState=true %>
<%@ Register TagPrefix="CityLibrary" TagName="Header_search" Src="..\include/header_search.ascx" %>
<%@ Register TagPrefix="CityLibrary" TagName="bar_empty" Src="..\include/bar_empty.ascx" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>

<script runat="server">

Sub Submit(Sender As Object, e As EventArgs)
if NOT Page.IsPostBack then
dim dTable as New DataTable("mySearch")
dTable.Columns.Add("catagory", System.Type.getType("System.String"))
dTable.Columns.Add("keyword", System.Type.getType("System.String"))
dTable.Columns.Add("ID", System.Type.getType("System.Int32"))
dTable.Columns("ID").AutoIncrement=True
Dim PrimaryKeyColumns(0) As DataColumn
PrimaryKeyColumns(0)= dTable.Columns("ID")
dTable.PrimaryKey = PrimaryKeyColumns
dim dr as DataRow=dTable.NewRow()
dr(0)=Listbox1.SelectedItem.value
dr(1)=tbtext.Text
dTable.Rows.Add(dr)
session("myCat")= dTable


else
dim dTable as New DataTable
dTable= session("myCat")
dim dr as DataRow=dTable.NewRow()
dr(0)=Listbox1.SelectedItem.value
dr(1)=tbtext.Text
dTable.Rows.Add(dr)
session("myCat")= dTable
end if

session.Timeout=2

dim keyword as String
dim catagory as String
dim objitem as new CityLibrary.libraryItem

keyword = tbtext.Text
catagory = Listbox1.SelectedItem.value

dim objReader as OleDbDataReader
objReader = objitem.GetLibraryItemGeneral(catagory,keyword)
session("mydata")=objreader
objReader.Close()
objitem.Dispose
Response.Redirect("searchresult.aspx")
End Sub


</script>

<html><body>


<table height="100%" cellspacing=0 cellpadding=0 width="100%">
<CityLibrary:Header_Search runat="server"/>
<tr height="100%">
<CityLibrary:bar_empty runat="server"/>


<td align=left valign="top" width=100% nowrap>
<table height="100%" valign="top" align="left" cellspacing=0 cellpadding=0 width="100%">
<tr height="100%" valign="top">
<td nowrap>
<table cellspacing=0 cellpadding=0 width="100%">
<tr>
<td valign="top">
&nbsp;<br>

<center>

<form action="Basicsearchmain.aspx" runat="server">

<h3> Name: <asp:Textbox id="tbText" type=text runat="Server"/><br><br>

UserGroup: <asp:Listbox runat="server" id="listbox1" width="200" rows="1"
SelectionMode="Single">
<asp:Listitem value="title">Title Keywords</asp:Listitem>
<asp:Listitem value="name">Author Last Name or FIrst Name</asp:Listitem>
<asp:Listitem value="subject">Subject Keywords</asp:Listitem>
<asp:Listitem value="kidstitle"> Kids' Reading Title</asp:Listitem>
<asp:Listitem value="kidssubject">Kids' reading Subject</asp:Listitem>
<asp:Listitem value="periodical">Periodical title</asp:Listitem>
<asp:Listitem value="keywordall">All Keywords</asp:Listitem>
</asp:Listbox><p>

<ASP:Button id="btSubmit" onclick="Submit" text="Lookup" runat="server"/>
</h3>
</form>

</center>
<hr>

</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body></html>

Dani AI

Generated

A few practical follow-ups that clarify the root cause and show safer patterns (ties to 's original code and 's cast suggestion).

The immediate exception most often comes from trying to work with a Session entry that is Nothing or not the expected type. The Submit event runs during a postback, so relying on a Page.IsPostBack branch inside that handler can leave the table uncreated on first submit. Casting the Session object is correct, but also check for Nothing before calling table methods.

Safer pattern (VB.NET) for getting/creating the table and adding a row without assuming the session entry exists:

Dim searchHistory As DataTable = TryCast(Session("SearchHistory"), DataTable)
If searchHistory Is Nothing Then
    searchHistory = New DataTable("SearchHistory")
    searchHistory.Columns.Add("Category", GetType(String))
    searchHistory.Columns.Add("Term", GetType(String))
    searchHistory.Columns.Add("Id", GetType(Integer))
    searchHistory.Columns("Id").AutoIncrement = True
    Session("SearchHistory") = searchHistory
End If

' Add a row in one call (avoids manual DataRow index assignments)
searchHistory.Rows.Add(listbox1.SelectedValue, tbText.Text)

Two extra, important points not covered yet in thread: do not store an OleDbDataReader in Session (a DataReader depends on an open connection and is forward-only). Instead load the results into a DataTable and keep that, or store only the search parameters and re-run the query on the results page. Example:

Dim results As New DataTable()
results.Load(reader)   ' populate a disconnected table
Session("SearchResults") = results

Additional tips: use parameterized commands to avoid injection, scope session timeout in web.config rather than setting it repeatedly in code, and prefer TryCast/Is Nothing checks to avoid InvalidCast/NullReference errors. Also consider memory impact of storing large DataTables in session (or use caching / re-querying).

The problem is this line of code

dTable= session("myCat")

you are trying to put a session varible datatype to a Datatable datatype (make sense?) but you can't do this implicitly, you must cast it to the datatype you want.

so it should be something like this

dTable = CType(Session("myCat"), DataTable)

Hope this helps

Happy coding :cool:

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.