SetDatasource()
メソッドを使用して、プロジェクトの.NETオブジェクトをデータソースとして使用して簡単なレポートを作成しています。ただし、レポートを実行すると、「データベースログオンに失敗しました」というエラーが表示されます。このレポートはDBにまったく接続していません-ここで何かを見逃したことがありますか?
どうもありがとう、D。
追加:コントローラーアクションを含めると、おそらく役立つと思います。これは迅速で汚いテストであり、最終的な方法がどのようになるかではありません。
public ActionResult StewardSheets(int showId, int groupId)
{
ReportClass rptH = new ReportClass();
rptH.FileName = DataHelper.getReportFilePath("Test.rpt",this);
NZDSDataContext dataContext = new NZDSDataContext();
var showDetails = (from s in dataContext.Shows
where s.ID == showId
select new StewardSheetModel
{
EventDate = s.EventDate.ToLongDateString(),
Region = s.Region.Name,
ShowTitle = s.Name
}).FirstOrDefault();
List<StewardSheetModel> details = new List<StewardSheetModel>();
details.Add(showDetails);
rptH.SetDataSource(details);
rptH.Load();
Stream stream = rptH.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
return File(stream, "application/pdf");
}
修正済み:D'oh! ReportDocumentの代わりにReportClassを使用しました。その行を変更し、Load()は有効なメソッドではないため、Refresh()も使用します。今では問題なく動作します!
適切なクラスを使用することで修正されました:ReportClassの代わりにReportDocument。
データソースとしてADO.NETDataSetsを使用している場合、DataSet定義がレポートの定義と同期しなくなる可能性があります。レポートデザイナのコンテキストメニューからデータベース->データベースの確認オプションを選択すると、多くの場合、この問題が修正されます。
また、レポートにリンクされたテーブルがあり、いずれかのテーブルのデータソースを設定しなかった場合、このエラーが発生します。修正は、レポートからテーブルを削除するか、データソースを正しく設定することです。
たとえば、レポートにCustomersテーブルとOrdersテーブルがいくつかのキーでリンクされている場合、両方のテーブルのデータソースを設定する必要があります。 1つだけを忘れて設定すると、かなり誤解を招く「データベースログオンの失敗」エラーが発生します。
// Create a new customer orders report.
CustomerOrdersReport report = new CustomerOrdersReport();
// Get the report data.
DataTable customersTable = getCustomersData();
DataTable ordersTable = getOrdersData();
// Set datasources.
report.Database.Tables["Customers"].SetDataSource(customersTable);
report.Database.Tables["Orders"].SetDataSource(ordersTable ); // Don't forget this line like I did!!
[レポート]-> [データベース]-> [データベースの確認]を右クリックしてみてください。
ダイアログボックスが表示されたら、DataSet .xsdファイル(DataSet1.xsdなど)を見つけて適用します。
私の問題はこのようにして解決しました。
レポートが参照している.NETオブジェクトの名前を変更した後、このダイアログがポップアップ表示され始めました。ダイアログを削除するには、レポートのセクションやフィールドで、見つけやすい.Netオブジェクトの古い名前が参照されていないことを確認する必要がありました。私の修正は、レポートにデータベースエキスパートの名前変更機能を使用することでした。
2018年7月のWindowsServerの更新後、Windows Server2016マシンで悪名高い「データベースログオンに失敗しました」エラーが発生し始めました。レポートは、開発マシンのVisual Studio 2017では正常に実行されましたが、本番環境のWindows Server2016のIISでは実行されませんでした。
1日の調査の後、開発マシンにMicrosoft OLE DB Driver for SQL Server https://docs.Microsoft.com/en-us/sql/)をインストールしました。 connect/oledb/oledb-driver-for-sql-server?view = sql-server-2017 。MSOLEDBSQLプロバイダーを使用してCrystalレポートデータベースエキスパートでレポート接続を作成しました。Microsoftをインストールする必要がありましたOLE本番WindowsServer2016マシン上のSQLServer用のDBドライバーも同様です。
Microsoftは、Microsoft OLE DB Provider for SQLServerを非推奨にすることを決定しました。これとネイティブクライアントはCrystalReportsで動作しなくなったようです。
私の場合、データソースをデータテーブルに設定するのを忘れています。このようなもの
rpt.Database.Tables( "Account")。SetDataSource(CType(DataSource.Account、DataTable))
ネイティブクライアント接続バージョン10を使用します。
「データベースログインエラー」を取り除くために、以下のコード行を書かなければなりませんでした
CrystalDecisions.Shared.TableLogOnInfo li;
li.ConnectionInfo.IntegratedSecurity = false;
このエラーの理由の1つは、uがnullオブジェクトをサブレポートに渡す場合.... SetDataSource(data)、ここでデータはnullです
私は、DataTableではなくDataSetを送信していたときにそれを行いました。
ReportDocument.SetDataSource(dataset.Tables [0]);