Рейтинг посещений

lenash
Дата: 11.05.2010 12:49:26
На странице список документов, это список хранится в базе (база на SQL2000). Если кликнуть по названию документа откроется виндос окно-> Открыть - Сохранить - Отмена. Как посчитать количество просмотров и сохранений выбранного документа?

Запрос к базе:

<%
SQL = "select un,name,data,link from korzina"
set rss = Server.CreateObject("ADODB.Recordset")
rss.Open SQL,cn
%>

А на страничке:

<td>
<a href="PS/doki/<%=rs("link")%>" Class="Zag1_1">
<%=rs("link")%></a>
</td>
docviewer
Дата: 11.05.2010 13:01:54
Давать не прямую ссылку на документ, а через промежуточную страницу, которая будет его возвращать. В этой странице считать количество и плюсовать его в базе.
lenash
Дата: 11.05.2010 13:14:50
А что будет на этой промежуточной странице? Если я правильно поняла, по она будет пустой и сразу с окном для выбора? И как так сделать?
iConst
Дата: 11.05.2010 13:26:50
lenash
А что будет на этой промежуточной странице? Если я правильно поняла, по она будет пустой и сразу с окном для выбора? И как так сделать?

По HTML разметке - пустой, а в логике - вызов содержимого из базы и отдача через Response.Write метод. В заголовках указать тип, длину документа.

А лучше это сделать хэндлером.
lenash
Дата: 11.05.2010 13:39:56
Хендлером это как?
ShSerge
Дата: 11.05.2010 13:42:16
lenash
...откроется виндос окно-> Открыть - Сохранить - Отмена...

Вы уверены, что это - аспнет? Может перенести тему?
lenash
Дата: 12.05.2010 08:25:22
Тему перенесла в HTML, а там молчат
Starlex
Дата: 12.05.2010 09:54:10
lenash,

Если попробовать sql инжекшеном, приблизительно так :)

SQL = "update counter set count=count+1 select un,name,data,link from korzina"

где counter - некая таблица и count - колонка в ней.

Конечно, если таких запросов несколько, то лучше делать отдельным модулем, как советовали.
iConst
Дата: 12.05.2010 11:22:16
lenash
Хендлером это как?

Примерно так:
<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;
using System.IO;
using System.Data.SqlClient;
using System.Data;


public class Handler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string _filename = "myfile.txt";
        MemoryStream memStream = new MemoryStream();
        string connString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=?????????????.MDF;Integrated Security=True;User Instance=True";

        try
        {
            string SqlString = "select * from dbo.Clients";
            SqlCommand sc = new SqlCommand();
            sc.Connection = new SqlConnection(connString);
            sc.Connection.Open();
            sc.CommandType = CommandType.Text;
            sc.CommandText = SqlString;
            SqlDataReader RS = sc.ExecuteReader();
            StreamWriter sw = new StreamWriter(memStream);
            if(RS.Read())
            {
                string tempstring = "";
                for(int counter = 0; counter < RS.FieldCount; counter++)
                {
                    tempstring += RS.IsDBNull(counter) ? "" : RS.GetName(counter) + "\t";
                }
                sw.WriteLine(tempstring);
                while(RS.Read())
                {
                    tempstring = "";
                    for(int counter = 0; counter < RS.FieldCount; counter++)
                    {
                        tempstring += RS.IsDBNull(counter) ? "" : RS.GetValue(counter).ToString() + "\t";
                    }
                    sw.WriteLine(tempstring);
                }
            }
            sw.Flush();
            sw.Close();
            RS.Close();
            sc.Connection.Close();
            sc.Dispose();

            byte[] byteArray = memStream.ToArray();
            memStream.Flush();
            memStream.Close();
            context.Response.Clear();
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + _filename);
            context.Response.AddHeader("Content-Length", byteArray.Length.ToString());
            context.Response.ContentType = "application/octet-stream";
            context.Response.BinaryWrite(byteArray);
        }
        catch(Exception Ex)
        {
            throw Ex;
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Если нужно отдавать различные данные - тогда парсим
string myparam1 = context.Request["myparam1"];
и конструируем запрос.
lenash
Дата: 13.05.2010 10:49:34
iConst

По HTML разметке - пустой, а в логике - вызов содержимого из базы и отдача через Response.Write метод. В заголовках указать тип, длину документа.

А лучше это сделать хэндлером.


Про хендлер я ничего не поняла. Это наверное больше для asp.net подойдет. Попробую объяснить на пальцах - вот как сделать -> Нажимаем на ссылку-документ, загружается страница пустая, а на ней сразу окно с выбором Открыть, Сохранить, Удалить?