ASPHostCentral.com Crystal Report Hosting BLOG

All about Crystal Report 2010 Hosting and Crystal Report 2008 Hosting articles

Crystal Report Hosting :: Crystal Reports in ASP.NET Web Applications

clock March 30, 2011 15:34 by author Administrator
Introduction

Crystal Reports is the built-in report designing tool in Visual Studio .NET and it is fully integrated with windows and web applications. It is very easy to use and design the reports with it. To add a report to a visual studio .NET projects (windows or web) you just need to right-click on the project name and add new Items, and add the crystal report from the list. As a result Visual Studio adds a report to the project and opens the report designer to let you design and edit the reports.

 In this article, we are not planning to get into the details of Crystal Reports. Every single kid can open Crystal Report and play with it to design some simple reports (definitely you need to know a lot about crystal to design a professional report but currently that is not our main topic). There are lots of complains about crystal reports from the programmers that this feature is NOT working properly and we see even more complains when developers try it for the web application. We plan to give you and overview and a walkthrough code on how to use crystal reports in the web applications.

Data flow in .NET applications

To understand where the problems come from with this beautiful feature added to Visual Studio .NET we need to understand how the data is transferred from the data provider (SQL Server) to CrystalReportViewer Object. Imagine we are using ADO .NET to get a subset of data from SQL Server and store it in a DataSet. Then we conduct the data from dataset to CrystalReportViewer object to be displayed.

SQL Server -> SQLConnection -> SQLDataAdaptor -> DataSet -> CrystalReportDocument -> CrystalReportViewer -> ASP .NET web page

Hey, what's going on here!? Yes, in .NET application Crystal Report Document reads the data from dataset, NOT directly from data provider and this is the key point to Crystal Report integration with .NET. As a result to open Crystal Reports into a web page we need to follow these steps:

1. Populating DataSet in the same way that we do it in ADO .NET Disconnected scenario.
2. Creating the CrystalReportDocument Object and introducing populated DataSet as it's report source.
3. Redirecting the generated report to CrystalReportViewer web control that is provided by ASP .NET.

Let's do it


Ingredients:

1. Visual Studio .NET or Visual Studio 2003
2. SQL Server 7.0/2000 (If you use MSDE you need to restore Northwind Database, it is not included in MSDE)
3. Microsoft windows XP Professional or 2000 (If you have problems running this code on Windows 2003 server send contact us)

Recipe

1. Preparing SQL Server to run ASP .NET Application
Open the SQL Server Enterprise manager, Expand SQL Server Group -> Computer Name -> Security. Then right-click on logins and New Login... . On General tab click on ellipses in front of the name textbox. Select ASPNET and click on Add, the press OK to add ASPNET account to logins. Then click on Database Access tab and check Northwind in the list. Press OK and make sure if the <ComputerName>\ASPNET account ( add <ComputerName>\IIS_WPG in windows 2003 server instead) is added to logins list. You don't need to give any other permission. Public user has read and write permission to Northwind Database.

2. Creating a New ASP .NET web application
Run the visual Studio .NET and Create a new project. In the project types select Visual Basic Projects, and for the template select ASP .NET Web Application. Change the location to http://localhost/CrystalRepSample and click OK.

3. Connecting the application to Northwind Database in SQL Server and filling the DataSet with Northwind data.
- Open the server explorer (Ctl+Alt+S), right-click on Data Connections, and then Add Connection, for the server name type localhost or (local) or the SQL Server instance name. Select Use windows NT Integrated security and then select Northwind from Select the database on the server.
- In the server explorer expand the newly created connection to Northwind, expand the Tables and the drag the products table and drop it on the form. This creates an SQL ServerConnection object to Northwind as ServerConnection1, and the SQLDataAdaptor1 to pump the data to the DataSet that we are just about to create.
- Right-click on the SQLDataAdaptor1 and click on Generate DataSet... and then in the Generate Dataset dialog box just accept the defaults and click OK. The DataSet11 will be added to your form.
- Double-Click on the Webform1 that will open the webform in code view. In the page load event add the proper code to populate the dataset using SQLDataAdaptor1 as following:
     SqlDataAdapter1.Fill(DataSet11, "Products")
- Now we have a dataset with data that we can provide the data to report designer.

4. Creating the report with Crystal Designer
- In the project menu select Add New Item...
- In the templates box select Crystal Report, change the name to rpProducts.rpt and and click Open.
- To save the time just accept the Report Expert and standard report and press OK.
- In the Standard report expert dialog box in the available data sources expand project data. Expand ADO .NET DataSets and expand CrystalRepSample.DataSet1, you will find Products table in there. Select it and click insert table. Then click Next.
-  In the Fields tab just select some fields and click Add.
- Just click on Finish button and your report is ready.
- At the moment we have a report that reads data from an ADO .NET DataSet

5. Creating the web interface to present report
- Open the Webform1.aspx in design mode.
- Click on a white space on the form and the in the properties window set the pageLayout to FlowLayout. (This step is very important because we are using as Web Custom Control)
- Go to the toolbox and click on Web Forms then select CrystalReportViewer from the list and drag and drop it in the webform1.aspx. CrystalReportViewer1 will be added to the form.

6. Providing the data to report
- Open webform1.aspx in Code View and go to Page_Load sub.
- AFTER the line of code that you have already added, add the following code

Dim cr As New rpProducts() ' Creates the ReportDocument object
cr.SetDataSource(DataSet11) ' Defines the source of data for report which is DataSet11
CrystalReportViewer1.ReportSource = cr ' Makes the ReoprtViewer web control to know it's report source
CrystalReportViewer1.DataBind() ' You need to remind CrystalReportViewer1 that there is some data. Update the interface
 

7. Building and testing the application
Just press Ctl +F5 to build and run the application




Currently rated 1.4 by 7 people

  • Currently 1.428571/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Crystal Report Hosting :: Solving the Login Failed Error in Crystal Reports

clock March 14, 2011 17:48 by author Administrator

Introduction

In his “Troubleshooting Database Login Errors using Crystal Reports with .NET,” Eric Landes points out that he sees questions regarding the “Exception Details: CrystalDecisions.CrystalReports.Engine.LogOnException: Logon failed” message quite often in the newsgroups.  That's an understatement.  Since I use the “push” method (generating an ADO.NET dataset first, then setting the report's DataSource), I never saw this error, but I decided to try and replicate the problem to see why this was happening--it seems to be a popular error.  I had a suspicion that impersonation and the “double hop“  (where the ASP.NET application cannot pass the user's credentials) may play a role in this problem, since the methods in Eric's article don't solve the problem for every user it should.

To replicate the problem, I used an ASP.NET project connecting to either a remote production SQL Server database or a copy of the same database on my development machine (SQL Server Developer Edition).  I created a stored procedure that was just a simple SELECT statement, and used this stored procedure as my report source (“pull“ method).  I probably created this report 20 different ways, testing various options, and here's what I found.

Lesson 1: Integrated or SQL Server Security

When you begin to design your report, you are prompted to connect to the SQL Server database when you choose an OLEDB connection (CR.NET doesn't use ADO.NET, and ODBC requires a system DSN).  Your choices are to use Integrated Security or to enter a user ID and password.  If you choose Integrated Security, Visual Studio will use your credentials to connect to the SQL Server database via Windows Authentication.

If you choose to enter a user ID and password, VS will connect using SQL Server authentication.  You cannot enter another domain account in the user ID and password boxes and connect using those credentials via Windows Authentication.  This information in these textboxes can only be used for SQL Server authentication.  Even though you must enter a password at this stage, the password information is not stored within the report file for security reasons.  The password is only used to establish the database connection.  This means you must apply logon information to each table at runtime as shown in Eric's article.

The security method you choose at this point is the security method you must use when you generate your report, as we'll see in Lesson 2.

Lesson 2: Only One Security Model Allowed

The Crystal Reports engine cannot switch from Integrated Security to SQL Server security.  This means that if you design your report using Integrated Security, you must supply a domain user's credentials in code to log on to the SQL Server (you can change the user, but it must be a domain account).  If you will be using a SQL Server account in production, it is very important that you use this account's credentials to connect to the database during the design phase.

The CR designer caches database connection information, so I have found it best to completely delete all current connections and then exit and reopen Visual Studio before designing my report.  I could then make a fresh connection to the database using the credentials I wanted.  You can check by right-clicking the connection in Server Explorer and choosing “properties.”  If you're using a SQL Server account, you'll see a user name; if using Integrated Security, the user name will not appear.

When using SQL Server authentication, I found it was also best if there was a SQL Server login account with the same user name on my dev database as well as the production database.  You should be able to use a different SQL Server account in production than in development, but I had occasional problems I couldn't explain when I tried to do so.

Lesson 3: Credential Delegation/Impersonation ("Double Hop")

Integrated Security can only be used in two contexts: when inside Visual Studio (which, since it is a Windows Application, can directly use your network token to connect to the remote database), or when IIS and SQL Server are on the same production machine.  If you try to use Integrated Security on a production IIS Server with a remote SQL Server, you will get the “Logon Failed” error.  This is because the application cannot impersonate your credentials from the IIS Server to the SQL Server (the “double hop”) without Kerberos or some sort of delegation set up.

Kerberos is running on the network I tested, and normal ASP.NET apps impersonate my credentials to the SQL Server, so it appears that the Crystal Reports engine cannot take advantage of Kerberos.  Not every network has Kerberos running, so if in doubt, ask the network admins.

When testing whether or not the Crystal engine could use impersonation, I tried both specifying my user name and password in the web.config file as well as leaving the information blank (and the ASP.NET worker process would use the current login credentials).  In both cases, the report was unable to connect to a remote SQL Server database.  The CR engine could connect to a database hosted on the same machine.

If you are using the pull method, this means your only option to connect to a remote SQL Server is to create a new SQL Server login with minimum permissions (note: do not use 'sa' or some other administrative login--this is a bad security practice), and use that login's credentials in your code.  This is actually not a bad thing at all, but I could not find mention of this in any Crystal documentation.

Lesson 4: Design Changes Sometime Cause Login Failure

Sometimes, after making small changes (such as removing a field from the report), I would get the “logon failed” error.  I found that after verifying the database (right-click on report, choose Database >> Verify Database) and recompiling the project, the problem went away.

Conclusion

This article is not an all-encompassing list of causes for the "login failed" error.  This error is pretty general and may be thrown for reasons other than login credentials.  In these cases, knowing some of the causes for this error may save you some debugging time.

Before starting a Crystal Reports application in ASP.NET, you need to give some thought as to the security context your application will be running under.  In addition to data security and application security, you must also consider how the report will connect to the database.

Personally, I still prefer the push method.  Since this method uses ADO.NET datasets, it can take advantage of the optimzed System.Data.SqlServer class for better performance, and security is handled in the connection string or by application impersonation as specified in the web.config file.

Currently rated 3.0 by 22 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Crystal Report Hosting

ASPHostCentral is a premier web hosting company where you will find low cost and reliable web hosting. We have supported the latest Crystal Report 2010 (v13 and v14) hosting. We have also supported the latest ASP.NET 4.5 hosting and ASP.NET MVC 4 hosting. We have supported the latest SQL Server 2012 Hosting and Windows Server 2012 Hosting too!

 

Sign in