Использование SQLDataReader с SQLDataSource и значениями элементов управления на странице - PullRequest
0 голосов
/ 11 августа 2011

У меня есть поисковая система, которая использует элемент управления SqlDataSource в ASP.NET, который получает данные из хранимой процедуры с параметрами. Я получаю параметры из значений по умолчанию и элементов управления на странице, чтобы пользователь мог получить то, что он хочет. Затем эти данные отображаются в элементе управления GridView.

Теперь я должен добавить кнопку экспорта, которая будет экспортировать результаты в документ Excel, который будет загружен пользователем. Я не уверен, что это лучший способ, но я использовал для этого алгоритм от Microsoft (http://support.microsoft.com/default.aspx?scid=kb;en-us;308247)). Проблема возникла, когда я попытался получить значения полей поиска. используйте это как шаблон, поскольку у нас есть около десятка поисковых систем, и мы хотели бы иметь что-то, что работает динамически.

Вот пример элемента управления SqlDataSource на странице aspx:

<asp:SqlDataSource ID="SearchDataSource" runat="server"
    ConnectionString="CONNECTIONSTRING"
    ProviderName="System.Data.SqlClient"
    SelectCommand="sp_SearchEngine_BASE" 
    SelectCommandType="StoredProcedure" onselected="SearchDataSource_Selected">
    <SelectParameters>
        <asp:ControlParameter ControlID="ctlID1" DbType="SomeType" DefaultValue="" 
            Name="spParamA" PropertyName="aProperty" />
        <asp:ControlParameter ControlID="ctlID2" DbType="SomeType" DefaultValue="" 
            Name="spParamB" PropertyName="aProperty" />
    </SelectParameters>
</asp:SqlDataSource>

А вот код экспорта:

protected void exportExcel()
    {
        int i;
        String strLine = "", filePath, fileName, fileExcel;
        FileStream objFileStream;
        StreamWriter objStreamWriter;
        Random nRandom = new Random(DateTime.Now.Millisecond);
        //Dim fs As Object, myFile As Object
        SqlConnection cnn = new SqlConnection(SearchDataSource.ConnectionString);

        //Create a pseudo-random file name.
        fileExcel = "t" + nRandom.Next().ToString() + ".xls";

        //Set a virtual folder to save the file.
        //Make sure that you change the application name to match your folder.
        filePath = Server.MapPath("\\ExcelTest");
        fileName = filePath + "\\" + fileExcel;

        //Use FileStream to create the .xls file.
        objFileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
        objStreamWriter = new StreamWriter(objFileStream);

        //Use a DataReader to connect to the Pubs database.
        cnn.Open();
        String sql  = SearchDataSource.SelectCommand;
        SqlCommand cmd = new SqlCommand(sql, cnn);

        //cmd.Parameters.Add(SearchDataSource.SelectParameters[0].);
        for (i = 0; i <= SearchDataSource.SelectParameters.Count - 1; i++)
        {
            // ---------------------------------------
            // ----- Here is where I am stuck... -----
            // ---------------------------------------
            //cmd.Parameters.AddWithValue(SearchDataSource.SelectParameters[i].Name, WhatDoIPutHere);
        }

        SqlDataReader dr;
        dr = cmd.ExecuteReader();

        //Enumerate the field names and records that are used to build the file.
        for(i = 0; i <= dr.FieldCount - 1; i++) {
           strLine = strLine + dr.GetName(i).ToString() + "\t";
        }

        //Write the field name information to file.
        objStreamWriter.WriteLine(strLine);

        //Reinitialize the string for data.
        strLine = "";

        //Enumerate the database that is used to populate the file.
        while (dr.Read()) {
           for(i = 0; i<= dr.FieldCount - 1; i++) {
              strLine = strLine + dr.GetValue(i) + "\t";
           }

           objStreamWriter.WriteLine(strLine);
           strLine = "";
        }

        //Clean up.
        dr.Close();
        cnn.Close();
        objStreamWriter.Close();
        objFileStream.Close();
        /*
        //Show a link to the Excel file.
        HyperLink1.Text = "Open Excel";
        HyperLink1.NavigateUrl = fileExcel;
        */
    }

Поскольку он должен быть динамическим, код экспорта должен работать независимо от того, используется в элементе управления SqlDataSource. Поэтому, если у него больше параметров, другая строка подключения или что-то в этом роде, он все равно должен работать. Нам не нужно менять код для другого движка.

Итак, вот вопрос: Как я могу получить значения элементов управления, используемых SqlDataSource SearchDataSource в качестве параметров для SqlDataReader dr в пользовательском методе C # void exportExcel(), связанного с моей страницей aspx без жесткого -кодирование идентификаторов элементов управления?

1 Ответ

0 голосов
/ 11 августа 2011

Примерно так должно работать:

for(int i = 0; i < SearcDataSource.SelectParameters.Count; i++)
{
   string controlId= (ControlParameter)SearchDataSource.SelectParameters[i].ControlID;
}

Вы можете сделать здесь тоже самое и проверить на ноль:

for(int i = 0; i < SearcDataSource.SelectParameters.Count; i++)
{
   var controlParam = SearchDataSource.SelectParameters[i] as ControlParameter;
   if (controlParam == null) continue;
   string controlId= controlParam.ControlID;
}

Чтобы получить значение, вам необходимо оценить объект ControlParameter, используя метод Evaluate: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.controlparameter.evaluate.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...