Member 12856488 Ответов: 2

Извлечение pdf или doc файлов из базы данных sqldatabase


Я пытаюсь получить pdf или любой другой файл из базы данных sql,но получаю ошибку, индекс которой находится вне диапазона. Должен быть неотрицательным и меньше размера коллекции

Что я уже пробовал:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
    <columns>
        <asp:BoundField DataField="Section" HeaderText="File Name" />
        <asp:BoundField DataField="Category" HeaderText="File Name" />
        <asp:TemplateField ItemStyle-HorizontalAlign="Center">
            <itemtemplate>
               
                 <asp:LinkButton ID="lnkView" OnClick="OpenDocument" runat="server" Text='<%# Eval("Link") %>'>

protected void OpenDocument(object sender, EventArgs e)
{
    LinkButton lnk = (LinkButton)sender;
    GridViewRow gr = (GridViewRow)lnk.NamingContainer;
    if (gr.RowIndex > 0)
    { 
    int id = int.Parse(GridView1.DataKeys[gr.RowIndex].Value.ToString());
    Download(id);
    }
}
private void Download(int id)
{
    DataTable dt = new DataTable();
    string constr = ConfigurationManager.ConnectionStrings["IntranetConnectionString"].ConnectionString;
    using (SqlConnection con = new SqlConnection(constr))
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.CommandText = "SELECT Seqn, Section, Category, Link from Links WHERE Seqn = @seqn ";
            cmd.Connection = con;
            cmd.Parameters.Add("@seqn", SqlDbType.Int).Value = id;
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            dt.Load(reader);
        }
    }
    string name = dt.Rows[0]["Category"].ToString();
    byte[] documentBytes = (byte[])dt.Rows[0]["Link"];
    Response.ClearContent();
    Response.ContentType = "application/octetstream";
    Response.AddHeader("Content-Disposition", string.Format("attachment; filename={}", name));
    Response.AddHeader("Content-Length", documentBytes.Length.ToString());

    Response.BinaryWrite(documentBytes);
    Response.Flush();
    Response.Close();
 }
private void FillData()
{
    DataTable dt = new DataTable();
    string constr = ConfigurationManager.ConnectionStrings["IntranetConnectionString"].ConnectionString;
    using (SqlConnection con = new SqlConnection(constr))
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.CommandText = "SELECT Seqn, Section, Category, Link from Links ";
            cmd.Connection = con;
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();
           
            dt.Load(reader);
          
            con.Close();
        }
        if (dt.Rows.Count > 0)
        {
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }
}

Richard Deeming

Вы собирались сказать нам, из какой строки этого кода выбрасывается исключение?

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Линия?

j snooze

Как получилось, что вы проверяете количество строк данных в FillData, но не загружаете, мне кажется, вы предполагаете, что данные возвращаются в методе загрузки и сообщают ему доступ к строке [0]...Если данных нет, то ваш индекс выходит за пределы. Просто мысль.

Karthik_Mahalingam

используйте отладчик, чтобы найти строку, в которой возникает ошибка

2 Ответов

Рейтинг:
1

mahender danam

Член 12856488 написал:
идентификатор инт = инт.Синтаксический Анализ(Управления Gridview1.DataKeys[гр.RowIndex]. Значение.Метод toString());

проверьте количество datakeys


Рейтинг:
0

kkakadiya

on whichh line you are getting error?
first need to check datakey and then rowindex.
and these two are ok then check final id which you are passing to download function.