Half of Classic ASP page works great, 2nd half gives SQL connection error - sql

Please help!
I am moving a Classic ASP & ASP.Net website from one server to another, and one of the reports that works fine on the old server is only partially working on the new server.
Can someone please tell me:
If there is anything that might be preventing a successful connection to SQL server.
If there is anything else involved in the this than:
Connection String
ASP Page
DLL
My server environment:
Windows Server 2008 R2
SQL EXPRESS 2008
IIS7
Connection Details:
The Classic ASP pages of this website connect using a SQL connection string located in the registry. The other Classic ASP pages on the website are working just fine....and the first half of this report is also working just fine.
I have tested the connection string individually, and it connects properly.
Report Structure Details:
The first half of the report (that is working correctly) loads data directly from a table in the database to display each item in a list format. It also uses the EMPLOYEES table to populate the employee name for each item in the list.
The second half of the report (that is NOT working) loads data from the same table as the first half. However, it groups them by manager (Manager Details are stored in the EMPLOYEES table).
So, both half of the reports are accessing the same tables for information....the only difference is how they are displayed.
Error Details
Microsoft OLE DB Provider for SQL Server->DLL.Shape_DB.ShapeCMdWithRS(SHAPE {select * from employees where username in (select mgr_username from employees where empID in (select empID from time_off_requests where mgr_code=0)) order by last_name, first_name} APPEND ([select time_off_requests_view.*, employees.mgr_username as username from time_off_requests_view inner join employees on employees.empID = time_off_requests_view.empID where mgr_code=0} relate username to username) as timeoff, ...)#WEBSITENAME[version 4.0.480] error '80004005'
[DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied.
Code Details
Here is the CLASSIC ASP code for the part of the website that DOES work:
set time_off_requests = DLL.TimeOffAdminPending()
%>
<CENTER>
<%
if time_off_requests.EOF then %>
<font class="headerNoBold">No Pending Time Off Requests<BR>
<% else %>
<font class="headerNoBold">Pending Time Off Requests</font>
<table cellspacing="0" cellpadding="3" width="500" align=center border=0 bordercolorlight=#000000 bordercolordark=#000000>
<TR bgcolor=#ffffcc>
<TD width=33% align=center><B>Date</B></TD>
<TD width=33% align=center><nobr><B>Requested By</B></nobr></TD>
<TD width=33% align=center><nobr><B>Type</B></nobr></TD>
</TR>
<%
dim theDate
do while not time_off_requests.EOF
if (time_off_requests.AbsolutePosition mod 2) = 0 then %>
<TR bgcolor=#ffffcc>
<% else %>
<TR bgcolor=#ffffff>
<% end if %>
<TD class="smallText" align=center>
<A HREF="time_off_request_details.asp?timeoffreq_id=<% = time_off_requests("timeoffreq_id") %>">
<% = time_off_requests("dt_created") %>
</A>
</TD>
<TD class="smallText" align=center><% = time_off_requests("last_name") %>, <% = time_off_requests("first_name") %></TD>
<TD class="smallText" align=center><% = time_off_requests("time_off_type") %></TD>
</TR>
<%
time_off_requests.MoveNext
loop %>
</TABLE>
<% end if %>
Details from the DLL
Function TimeOffAdminPending() As ADODB.Recordset
TimeOffAdminPending = RunCmdWithRS("select * from time_off_request_view where mgr_code =0 and empID in (select empID from employees where mgr_username = '" & username & "')")
End Function
Here is the CLASSIC ASP code for the part that DOES NOT work:
<% set managers = DLL.PendingTimeOffMgr()
if not managers.EOF then %>
<font class="headerNoBold">Pending Manager Time Off Approvals</font>
<table cellspacing="0" cellpadding="3" width="500" align=center border=0 bordercolorlight=#000000 bordercolordark=#000000>
<TR bgcolor=#ffffcc>
<TD width=33% align=center><B>Date</B></TD>
<TD width=33% align=center><nobr><B>Requested By</B></nobr></TD>
<TD width=33% align=center><nobr><B>Type</B></nobr></TD>
</TR>
<% do while not managers.EOF
set time_requests = managers.Fields("timeoff").Value %>
<TR><TD colspan=3>
<% = managers("last_name") %>, <% = managers("first_name") %>
</TD><TR>
<%
do while not timeoff_requests.EOF
if (timeoff_requests.AbsolutePosition mod 2) = 0 then %>
<TR bgcolor=#ffffcc>
<% else %>
<TR bgcolor=#ffffff>
<% end if %>
<TD class="smallText" align=center>
<% = timeoff_requests("dt_created") %>
</TD>
<TD class="smallText" align=center><% = timeoff_requests("last_name") %>, <% = timeoff_requests("first_name") %></TD>
<TD class="smallText" align=center><% = timeoff_requests("timeoff_type") %></TD>
</TR>
<%
timeoff_requests.MoveNext
loop
managers.MoveNext
loop %>
</TABLE>
<% end if %>
Details from the DLL
PendingTimeOffMgr() As ADODB.Recordset
PendingTimeOffMgr = ShapeCmdWithRS("SHAPE {select * from employees where username in (select mgr_username from employees where empID in (select empID from time_off_requests where mgr_code = 0)) order by last_name, first_name} APPEND ({select time_off_requests_view.*, employees.mgr_username as username from time_off_requests_view inner join employees on employees.empID=time_off_requests_view.empID where mgr_code = 0} relate username to username) as timeoff")
End function

Related

Fastest `where` request involving three models in Rails

I'm having a little trouble with a slow page load in Rails, I'm certain due to the way I'm querying the database (PostgreSQL).
To summarise the situation, I've three models - let's call them Model A, Model B and Model C - that I'm plugging into a table, and am struggling to find an efficient way to query the data.
Model A provides the table's header row, Model B each row in the tbody; Model C belongs to both Model A and Model B and provides the table data.
Here's a quick example:
Say the model variables are as follows:
#model_a = ModelA.all
#model_b = ModelB.all
#model_c = ModelC.all
Related as follows:
class ModelA
has_many :model_cs
end
class ModelB
has_many :model_cs
end
class ModelC
belongs_to :model_a
belongs_to :model_b
end
And in the view:
<table>
<thead>
<tr>
<th></th>
<!-- Model A provides the table headers -->
<% #model_a.each do |a| %>
<th>
<%= a.name %>
</th>
<% end %>
</tr>
</thead>
<tbody>
<!-- Each row represents a different instance of Model B -->
<% #model_b.each do |b| %>
<tr>
<td>
<%= b.name %>
</td>
<% #model_a.each do |a| %>
<td>
<!-- The actual table data is from Model C, when it belongs to both Model A and Model B -->
<% if (c = #model_c.where(model_a_id: a.id, model_b_id: b.id).first).present? %>
<%= c.name %>
<% end %>
</td>
<% end %>
</tr>
<% end %>
</tbody>
</table>
Obviously this is really slow and, I'd imagine, rather stinky code. I can cache the fragment, but would much rather speed up the request so it runs smoothly following any changes to the data. Happy to consider different approaches to this - I just can't think of a way to present the data in this manner without iterating through two models to query the third.
I'm sure there's a far, far better way to approach this but have yet to come up with it. Hope you guys can help - thanks in advance, Steve.
In the view, this code will run a new SQL query each table cell:
#model_c.where(model_a_id: a.id, model_b_id: b.id).first
So that's probably what's really hurting you. Remember that where is part of ActiveRecord and goes to the database, whereas select operates on enumerables and does everything in memory.
You should load everything with the right relationships upfront. I would start with this:
#model_a = ModelA.all
#model_b = ModelB.includes(:model_cs)
Then do this:
<tbody>
<!-- Each row represents a different instance of Model B -->
<% #model_b.each do |b| %>
<tr>
<td>
<%= b.name %>
</td>
<% #model_a.each do |a| %>
<td>
<!-- The actual table data is from Model C, when it belongs to both Model A and Model B -->
<% if c = b.model_cs.select{|x| x.model_a_id = a.id}.first %>
<%= c.name %>
<% end %>
</td>
<% end %>
</tr>
<% end %>
</tbody>
That should get you everything in two or three queries.
Note if A is large, the select will still perform poorly because it does a linear search. So you could write a method on your ModelB class like this instead, and use it in the view:
def model_c_for(a)
#model_c_by_a ||= Hash[
model_cs.map{|c| [c.model_a_id, c]}
]
#model_c_by_a[a.id]
end

How to get currently selected row from a resultset?

Please help me to get the currently selected row from this list. I tried to get it by sessions but it didnt work.
<% int icount=0;
while(rs.next())
{
String repairId = rs.getString("item.id");
String esn = rs.getString("esn");
String type = rs.getString("type");
session.setAttribute("repId", repairId);
session.setAttribute("repEsn", esn);
session.setAttribute("repType", type);
%>
<tr>
<td><div align="center"><%=++icount%></div></td>
<td><%=rs.getString("esn")%></td>
<td><%=rs.getString("type")%></td>
<td><%=rs.getString("technician")%></td>
<td><%=rs.getDate("date")%></td>
<td><div align="center">
<a href="LoadRepairEqipmentsServlet?repId=<%=repairId%>"
onclick="return edit()">Done Repair</a>
</div></td>
</tr>
<% } %>

Trying to enable/disable a hyperlink using code given. For some reason it doesnt work as expected

Following is my code snippet. Even when the rs.getString(10) is NULL in the table, I am getting the Download link enabled instead of it to display "Cannot Download".
<table border="1" width="100%" cellpadding="0" cellspacing="0">
<tr>
<th>FileName</th>
<th>Ip</th>
<th>Date</th>
<th>Download</th>
</tr>
<%
Connection con = DbConnector.getConnection();
PreparedStatement pstm = null;
//PreparedStatement pstm1 = null;
String sql = "SELECT * FROM transaction t LEFT JOIN mykeys m ON t.FileID = m.FileID UNION ALL SELECT * FROM transaction t RIGHT JOIN mykeys m ON t.FileID = m.FileID WHERE t.FileID IS NULL and t.status='Success'";
pstm = con.prepareStatement(sql);
ResultSet rs = pstm.executeQuery();
while (rs.next())
{
%>
<tr>
<td><%=rs.getString(2)%></td>
<td><%=rs.getString(4)%></td>
<td><%=rs.getString(5)%></td>
<%
if(rs.getString(10) != null)
{
%>
<td>Download</td>
<%
}
else
{
%>
<td>Cannot Download</td>
<%
}%>
</tr>
<%
}
%>
</table>
I have resolved the issue. The if condition is making a reference to null which is different than making a reference to the string "NULL". My code is now working as expected.

SQL that creates a new table, essentially, but with ActiveRecord

def reports
sql = "select username, email, sign_in_count, current_sign_in_at, \
(select count(*) from foo ft where ft.user_id = u.id and ft.state in ('complete', 'active', 'win', 'lose')) as foo_state, \
(select count(*) from bar where creator_id = u.id and m.state not in ('new','cancelled')) as bar_created, \
from users u where sign_in_count > 0 order by foo_state desc;"
#users = ActiveRecord::Base.connection.execute(sql)
end
So, this query is botched a bit for purposes of showing you something, but not bothering you with the details. This query takes a few different tables, queries them, and returns a new table essentially. I'm using postgreSQL, so this returns a PG::Result object. I can call #users.values to get an array of arrays, but I was wondering if there was a more 'rails-y' way do do this?
I'd like to do something like this in the view:
<%= render partial: 'users/shared/user', collection: #users, as: :user %>
but since it's not an actual ActiveRecord object, I can't seem to do that (although it doesn't throw an error if I try, it just doesn't display anything)
Can ARel accomplish a feat like this? Am I asking too much? Thanks!
For anyone else stumbling upon this... this works to get your info, at least:
<table>
<thead>
<tr>
<% #users.fields.each do |f| %>
<th><%= f %></th>
<% end %>
</tr>
</thead>
<tbody>
<% #users.values.each do |v| %>
<tr>
<% v.each do |a| %>
<td><%= a %></td>
<% end %>
</tr>
<% end %>
</tbody>
</table>

Time in hours and minutes... please suggest me

for login_details am calculating the time between login and logout but its calculating only in minutes, want in hours and minutes. please help me and written the code as below
<table>
<%count = 1%>
<%#login_info.each do |l| %>
<tr>
<td><%= count%></td>
<td><%=l.user.name%></td>
<td><%=Location.find(l.location_id).name%></td>
<td><%=showdatetime(l.login_time)%></td>
<td><%=showdatetime(l.logout_time)%></td>
<td> <%= time=(l.logout_time.minus_with_coercion(l.login_time)/60)%>minutes</td>
</tr>
<%count = count+1%>
<%end%>
</table>
check out this code
<%count = 1%>
<%#login_info.each do |l| %>
<tr>
<td><%= count%></td>
<td><%=l.user.name%></td>
<td><%=Location.find(l.location_id).name%></td>
<td><%=showdatetime(l.login_time)%></td>
<td><%=showdatetime(l.logout_time)%></td>
<td>
<%seconds = l.logout_time.to_i - l.login_time.to_i%>
<% days = seconds / 86400%>
hours = seconds / 3600%>
<%minutes = (seconds - (hours * 3600)) / 60%>
<%= hours.to_s + "hr" + minutes.to_s + "min"%></td>
</tr>
<%count = count+1%>
<%end%>
Check out distance_of_time_in_words.