Создать отчет Crystal на основе хранимой процедуры - PullRequest
0 голосов
/ 09 декабря 2011

Я хочу динамически генерировать отчет с использованием хранимой процедуры.Я использую RAS in-process SDK.Я уже создал отчеты с наборами данных.Я использую следующий код:

ISCRProcedure proc1 = new Procedure();
        CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo newConnectionInfo = new CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo();
        ISCRPropertyBag logonAttributes = new PropertyBag();
        PropertyBag connectionAttributes = new PropertyBag();
        logonAttributes.Add("Data Source", datasource);
        logonAttributes.Add("Initial Catalog", "Northwind");
        logonAttributes.Add("Provider", "SQLOLEDB");
        connectionAttributes.Add("Database DLL", "crdb_ado.dll");
        connectionAttributes.Add("QE_DatabaseType", "OLE DB (ADO)");
        connectionAttributes.Add("QE_LogonProperties", logonAttributes);
        connectionAttributes.Add("QE_SQLDB", true);
        connectionAttributes.Add("Server Name", servername);
        connectionAttributes.Add("SSO Enabled", false);
        newConnectionInfo.Attributes = connectionAttributes;
        newConnectionInfo.UserName = username;
        newConnectionInfo.Password = password;
        newConnectionInfo.Kind = CrConnectionInfoKindEnum.crConnectionInfoKindCRQE;
        proc1.ConnectionInfo = newConnectionInfo;
        proc1.Name = "sp_SelectAllOrders";
        oReportClientDocument.DatabaseController.AddTable(proc1);

Я не знаю, как получить доступ к выводу хранимой процедуры, чтобы позже использовать ее в качестве источника данных для полей отчета.Есть идеи?

1 Ответ

0 голосов
/ 09 декабря 2011

Если вы хотите увидеть рабочий пример, у меня есть бесплатный создатель объекта класса C #, создатель уровня данных и генератор хранимых процедур, расположенный по адресу: http://radstudio.codeplex.com

RAD Studio создает на 100% управляемую хранимую процедурууровень данных;

Приведенный ниже код взят из блока приложений MS, но в моем загруженном генераторе кода есть обертки для этого класса, упрощающие его;

 private static void FillDataset(SqlConnection connection, SqlTransaction transaction, CommandType commandType,
        string commandText, DataSet dataSet, string[] tableNames,
        params SqlParameter[] commandParameters)
    {
        if (connection == null) throw new ArgumentNullException("connection");
        if (dataSet == null) throw new ArgumentNullException("dataSet");

        // Create a command and prepare it for execution
        SqlCommand command = new SqlCommand();
        bool mustCloseConnection = false;
        PrepareCommand(command, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);

        // Create the DataAdapter & DataSet
        using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command))
        {

            // Add the table mappings specified by the user
            if (tableNames != null && tableNames.Length > 0)
            {
                string tableName = "Table";
                for (int index = 0; index < tableNames.Length; index++)
                {
                    if (tableNames[index] == null || tableNames[index].Length == 0) throw new ArgumentException("The tableNames parameter must contain a list of tables, a value was provided as null or empty string.", "tableNames");
                    dataAdapter.TableMappings.Add(tableName, tableNames[index]);
                    tableName += (index + 1).ToString();
                }
            }

            // Fill the DataSet using default values for DataTable names, etc
            dataAdapter.Fill(dataSet);

            // Detach the SqlParameters from the command object, so they can be used again
            command.Parameters.Clear();
        }

        if (mustCloseConnection)
            connection.Close();
    }
...