ورود

View Full Version : نحوه تغییر نام سرور درزمان اجرای برنامه



alireza1384
سه شنبه 02 تیر 1388, 12:35 عصر
سلام دوستان . من دربرنامه ام ازیک ریپورت استفاده کرده ام که درسیستم خودم جواب می دهد. اما وقتی گزارش را به سیستم دیگری که نام آن با سیستم فعلی متفاوت است منتقل می کنم ، درزمان اجرا نمی توانم ConnectionString مربوطه را به مقدار جدید تغییر بدهم. ازطریق کد زیر این کارراانجام می دهم ولی بدون آنکه پیغام خطایی بگیرم این عمل صورت نمی گیرد :لازم به ذکراست که بانک مورد استفاده sql2000 می باشد.

string password = "";
string UserId = "";
string DataBaseName = "";
string ServerName = "";

ConnectionInfo connectioninfo = new ConnectionInfo();
GetConnectionInfo(ref password, ref UserId, ref DataBaseName, ref ServerName);
connectioninfo.DatabaseName = Connection.clsConnection.Connection.Database;
connectioninfo.UserID = UserId;
connectioninfo.Password = password;
connectioninfo.ServerName = ServerName;
TableLogOnInfos tableLogoninfos = crystalReportViewer1.LogOnInfo;
foreach (TableLogOnInfo logoninfo in tableLogoninfos)
{
; logoninfo.ConnectionInfo = connectioninfo
{

bad_boy_2007
پنج شنبه 25 تیر 1388, 22:47 عصر
سلام
من هم دقیقا همین مشکل رو دارم ، از بس دنبال راه حل رفتم و نشد دیگه خسته شدم !!!
همین کاری رو هم که علیرضا کرد رو هم به چندین شکل مختلف کردم و نشد ، در ضمن کانکشن من بدون یوزر و پسورده .
ممنون میشم راهنمایی کنید :لبخندساده:

In_Chan_Nafar
شنبه 27 تیر 1388, 11:15 صبح
سلام
دوستان عزيز زماني كه شما SQL Server را نصب كنيد اگر براي آن Instance در نظر بگيريد نام سرور شما به صورت Computer Name\Instanc Name خواهد بود.
براي مثال نام كامپيوتر من Server2 هست و نام Instance اي كه SQL Server را با آن نصب كرده ام SQL2000 هست. حال نام سرور من server2\sql2000 خواهد بود. اگر هم به SQL Server خود Instance نداده باشيد نام كامپيوتر همان نام سرور خواهد بود.

bad_boy_2007
شنبه 27 تیر 1388, 12:15 عصر
سلام
دوستان عزيز زماني كه شما SQL Server را نصب كنيد اگر براي آن Instance در نظر بگيريد نام سرور شما به صورت Computer Name\Instanc Name خواهد بود.
براي مثال نام كامپيوتر من Server2 هست و نام Instance اي كه SQL Server را با آن نصب كرده ام SQL2000 هست. حال نام سرور من server2\sql2000 خواهد بود. اگر هم به SQL Server خود Instance نداده باشيد نام كامپيوتر همان نام سرور خواهد بود.

اینا رو میدونم
چطور میتونم در زمان اجرا کانکشن کریستال ریپورت رو تغییر داد ، این صورت سوال بود .
فکر کنم بیخیال شم بهتره !
دارم گزارشام رو میندازم رو دیتاست ، دیتاست رو از برنامه پر میکنم میدم به ریپورت

In_Chan_Nafar
شنبه 27 تیر 1388, 16:50 عصر
public void InitialReport(ReportDocument repDoc)
{

if (!File.Exists(RepPath + RepFileName))
throw new ErrorException("مسير فايل گزارش صحيح نمي باشد");

repDoc.FileName = RepPath + RepFileName;
AssignConnection(repDoc);

reportViewer1.ReportSource = repDoc;

}


حال در متد AssignConnection داريم:


private void AssignConnection(ReportDocument repDoc)
{
try
{
ConnectionInfo connection = new ConnectionInfo();

connection.ServerName = ServerName;
connection.DatabaseName = DataBaseName;

connection.UserID =UserIDSQL;
connection.Password = PasswordSQL;

// First we assign the connection to all tables in the main report
//
foreach (Table table in repDoc.Database.Tables)
{
AssignTableConnection(table, connection);
}

// Now loop through all the sections and its objects to do the same for the subreports
//
foreach (Section section in repDoc.ReportDefinition.Sections)
{
// In each section we need to loop through all the reporting objects
foreach (ReportObject reportObject in section.ReportObjects)
{
if (reportObject.Kind == ReportObjectKind.SubreportObject)
{
SubreportObject subReport = (SubreportObject)reportObject;
ReportDocument subDocument = subReport.OpenSubreport(subReport.SubreportName);

foreach (Table table in subDocument.Database.Tables)
{
AssignTableConnection(table, connection);
}
}
}
}
}

catch (Exception ex)
{
MessageBox.Show(this, ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}

}


در كد AssignTableConnection داريم:


private static void AssignTableConnection(CrystalDecisions.CrystalRepo rts.Engine.Table table, ConnectionInfo connection)
{
// Cache the logon info block
TableLogOnInfo logOnInfo = table.LogOnInfo;

// Set the connection
logOnInfo.ConnectionInfo = connection;

// Apply the connection to the table!
table.ApplyLogOnInfo(logOnInfo);
}


با اين كد مي توانيد زمان اجرا نام سرور و... را تغيير دهيد.
البته بازم مي توانيد اين كد را بهينه تر بنويسيد
موفق باشيد.

bad_boy_2007
شنبه 27 تیر 1388, 18:03 عصر
من دقیقا همین کد رو میخوام ولی برای کانکشنی که یوزر و پس نداره .
هر چی بهش ور رفتم نتونستم درست تغییرش بدم
برای Win Authentication

In_Chan_Nafar
یک شنبه 28 تیر 1388, 09:16 صبح
اگر از كامپيوتر Local به SQL Server با Win Authentication كانكت بشيد مشكلي پيش نمياره ولي اگه از Client ها كانكت بشيد شايد يكسري مشكلات خود SQL براتون داشته باشه كه تنظيمات خاص خودش را دارد.
متد AssignConnection را به صورت زير بنويسيد:


private void AssignConnection(ReportDocument repDoc)
{
try
{
ConnectionInfo connection = new ConnectionInfo();
connection.IntegratedSecurity = true;
connection.ServerName = ServerName;
connection.DatabaseName = DataBaseName;


// First we assign the connection to all tables in the main report
//
foreach (Table table in repDoc.Database.Tables)
{
AssignTableConnection(table, connection);
}

// Now loop through all the sections and its objects to do the same for the subreports
//
foreach (Section section in repDoc.ReportDefinition.Sections)
{
// In each section we need to loop through all the reporting objects
foreach (ReportObject reportObject in section.ReportObjects)
{
if (reportObject.Kind == ReportObjectKind.SubreportObject)
{
SubreportObject subReport = (SubreportObject)reportObject;
ReportDocument subDocument = subReport.OpenSubreport(subReport.SubreportName);

foreach (Table table in subDocument.Database.Tables)
{
AssignTableConnection(table, connection);
}
}
}
}
}

catch (Exception ex)
{
MessageBox.Show(this, ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}

}


در هر صورت توصيه مي كنم كه از sa استفاده كنيد كه هم برنامه امن تر باشه و هم مشكلات شما كمتر باشه. ما با جاهايي كار كرديم كه هيچ وقت Pass كاربر sa رو براي امنيت برنامه بهشون نداديم پس خيلي از اين موضوع بي تفاوت رد نشيد.
موفق باشيد.

bad_boy_2007
یک شنبه 28 تیر 1388, 19:54 عصر
ممنون دوست من
ولی نمیدونم چرا نمیشه !
این کد ها رو قبلا تست کرده بودم ، ولی نشد
دوباره هم که شما زحمتش رو کشیدید تست کردم ولی باز هم نشد
ببینید ، چون پروژه من با vb هست اول اومدم کلاسی به شکل زیر تو یک پروژه دیگه تو همون سلوشن به زبون c# انداختم و ریفرنس دادم به پروژه خودم ولی نشد :



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CrystalDecisions.CrystalReports.Engine ;
using CrystalDecisions.Shared;
using System.Windows.Forms;
namespace BackSell
{
public class SetCrystalConnection
{
private static void AssignTableConnection(CrystalDecisions.CrystalRepo rts.Engine.Table table, ConnectionInfo connection)
{
// Cache the logon info block
TableLogOnInfo logOnInfo = table.LogOnInfo;
// Set the connection
logOnInfo.ConnectionInfo = connection;
// Apply the connection to the table!
table.ApplyLogOnInfo(logOnInfo);
}

public ReportDocument AssignConnection(ReportDocument repDoc)
{
try
{
ConnectionInfo connection = new ConnectionInfo();
connection.IntegratedSecurity = true;
connection.ServerName = ".\\sqlexpress";
connection.DatabaseName = "a";

// First we assign the connection to all tables in the main report
//
foreach (Table table in repDoc.Database.Tables)
{
AssignTableConnection(table, connection);
}
// Now loop through all the sections and its objects to do the same for the subreports
//
foreach (Section section in repDoc.ReportDefinition.Sections)
{
// In each section we need to loop through all the reporting objects
foreach (ReportObject reportObject in section.ReportObjects)
{
if (reportObject.Kind == ReportObjectKind.SubreportObject)
{
SubreportObject subReport = (SubreportObject)reportObject;
ReportDocument subDocument = subReport.OpenSubreport(subReport.SubreportName);
foreach (Table table in subDocument.Database.Tables)
{
AssignTableConnection(table, connection);
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return repDoc;
}
}
}


بعد اومدم و کدها رو تبدیل کردم به vb تو پروژه اصلیم ، به شکل زیر :


Dim rpt As New RPTSell()
For Each table In rpt.Database.Tables
' Cache the logon info block
Dim logOnInfo As CrystalDecisions.Shared.TableLogOnInfo = New CrystalDecisions.Shared.TableLogOnInfo
' Set the connection
logOnInfo.ConnectionInfo = connection
' Apply the connection to the table!
table.ApplyLogOnInfo(logOnInfo)
Next
For Each Section In rpt.ReportDefinition.Sections
For Each ReportObject In Section.ReportObjects
If (ReportObject.Kind = CrystalDecisions.Shared.ReportObjectKind.Subreport Object) Then
Dim subReport As CrystalDecisions.CrystalReports.Engine.SubreportOb ject = CType(ReportObject, CrystalDecisions.CrystalReports.Engine.SubreportOb ject)
Dim subDocument As CrystalDecisions.CrystalReports.Engine.ReportDocum ent = subReport.OpenSubreport(subReport.SubreportName)
For Each Table In subDocument.Database.Tables
' Cache the logon info block
Dim logOnInfo As CrystalDecisions.Shared.TableLogOnInfo = New CrystalDecisions.Shared.TableLogOnInfo
' Set the connection
logOnInfo.ConnectionInfo = connection
' Apply the connection to the table!
Table.ApplyLogOnInfo(logOnInfo)
Next
End If
Next
Next


ولی باز هم نشد و خطای زیر رو میده :

Error in File C:\DOCUME~1\green\LOCALS~1\Temp\temp_5c7a026b-f745-4865-8b24-e56750cfca9e {58BF7C45-2A94-4FDC-AC9E-DDA9DB184221}.rpt: The table could not be found.

لازم به ذکره که من هر وقت میخوام تنظیمات کانکشن کریستال رو تغییر بدم از تو گزارشم میتونم این کار رو بکنم و مطمئنم که مشکل از گزارش نیست .

In_Chan_Nafar
سه شنبه 30 تیر 1388, 11:36 صبح
سلام
به اين مشكل خورديم يه بار ولي يادم نيست چطوري حلش كرديم.

شايد اگه يادم باشه بايد فايل زير را پيدا كرده و اجرا نماييد.
CRRedist2008_x86.msi
17.1 مگابايت هست.

bad_boy_2007
سه شنبه 30 تیر 1388, 22:00 عصر
ممنون دوست من :لبخندساده:
دیگه داشتم کم کم دیونه میشدوم !!
تو نت حداقل 20 ساعتی سرچ زدم (فارسی و اینگلیش) ولی به کدهایی مشابه کدهای شما برخودم که مشکل دوستان رو حل کرده بود ولی روی برنامه من ....
حالا حداقل فهمیدم که مشکل از من نیست !!! :قهقهه:
چک میکنم نتیجه رو میگم ، با اینکه تعداد زیادی از گزارشام رو انداختم روی دیتاست .

bad_boy_2007
سه شنبه 30 تیر 1388, 22:13 عصر
این رو پیدا کردم :


Microsoft / business objects have changed the way Crystal Reports based applications can be deployed. It used to be complicated enough, now things have changed and apparently the documentation is scarce on the subject. I was sitting in a cafe a couple days ago trying to upgrade the source of one of my apps to visual studio 2008, I realized the crystal reports merge modules were not found anymore and wasn’t able to find any info about this in the documentation… god I hate that, everything should be findable in the docs (either the search function or the content have something to do with it, but somehow msdn docs can be unsettling sometimes). I found the solution to the problem as soon as I got connected to the internet.
It used to be be that you could deploy a Crystal Reports based project using merge modules, the new way to deploy crystal reports under visual studio 2008 is to use a redistributable msi package located under “C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalRe ports10_5\CRRedist2008_x86.msi”. I haven’t figured out a visual studio UI supported way to deploy this package at the same time as my application, and it looks as if, for now, one needs to deploy crystal reports separately. I will post my solution to this problem when I find out how to do this.

ظاهرا گفته شما رو تایید میکنه ، در حال دانلودم . نتیجه رو همینجا اعلام میکنم :گیج:

bad_boy_2007
سه شنبه 30 تیر 1388, 22:34 عصر
مشکل رفع شد
اون فایلی رو که گفته بودید از آدرس :

C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalRe ports10_5\CRRedist2008_x86.msi

نصب کردم ، تست کردم هیچ مشکلی نیست

فقط یک مورد ، چرا سرعت چاپ گزارش اینقدر پایینه !؟
از دیتاست که میخونم نسبتا سریع تره ولی باز هم کنده
باید چیکار کنم سریع پرینت بشه ؟؟

In_Chan_Nafar
چهارشنبه 31 تیر 1388, 10:43 صبح
كاري نمي شه كرد.
كريستال رپورت چون com هست سرعتش پايين هست البته براي سري اول در سري هاي بعد كمي سرعت بهتر مي شه.
توجه داشته باشيد كه به شما هر چقدر dataBase رو خوب طراحي كنيد، از index ها گرفته تا SP ها باز در سرعت دخيل هست ولي در كل سرعت كريستال پايين هست كاري هم نمي شه كرد.
موفق باشيد

bad_boy_2007
چهارشنبه 31 تیر 1388, 22:28 عصر
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه:
سلام
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه:
بالا مثل اینکه کریستال نمیخواد با ما راه بیاد !!!
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه:
دیشب مشکل رفع شده بود و کار میکرد ولی الان ...
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه:
دیگه این سری واقعا بیخیال دیتابیس میشم ، میندازم رو دیتاست !!
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه:

In_Chan_Nafar
پنج شنبه 01 مرداد 1388, 08:44 صبح
معماري برنامه تون رو مي شه كاملا توضيح بدين
تحت شبكه هست؟
Client /server هست يا Pear to Pear؟
در Server ايراد داره يا در Client ها؟
ما بارها از اين روش استفاده كرديم مشكلي نداره.

hamidyha
شنبه 03 مرداد 1388, 09:57 صبح
من این مشکل رو داشتم که یکی از دوستان در همین انجمن من رو راهنمایی کرد

نقل از دوست عزیز sm
برای اینکه مشکل نام سرورتون حل بشه باید وقتی میخواهید وصل به بانک شوید نام سرورتون رو به یکی از این دو شکل بزارید:
(local) یا فقط یک نقطه .
در این دو صورت به سرور محلی بدون نیاز به تغییر نام وصل میشه

kiosksoft
شنبه 03 مرداد 1388, 16:54 عصر
دوستان ی که نمتوانند در زمان اجرا Connection رو تغییر بدن از یک ODBC استفاده کنن . که همیشه و در تمام سیستم ها میتواند ثابت باشد !!

bad_boy_2007
یک شنبه 04 مرداد 1388, 20:18 عصر
معماري برنامه تون رو مي شه كاملا توضيح بدين
تحت شبكه هست؟

این برنامه برای کار در شبکه طراحی شده و معماری C/S داره .


برای اینکه مشکل نام سرورتون حل بشه باید وقتی میخواهید وصل به بانک شوید نام سرورتون رو به یکی از این دو شکل بزارید:
(local) یا فقط یک نقطه .

این به درد من نمیخوره ، چون اول از همه برنامه میخواد تو شبکه کار کنه و ثانیا جدا از اسم سرور اسم دیتابیسم هم قابل تغییره که بر اساس اینکه در صفحه لاگین برنامه تنظیمات شبکه به چه شکلی باشه برنامه به بانک متصل میشه .


دوستان ی که نمتوانند در زمان اجرا Connection رو تغییر بدن از یک ODBC استفاده کنن . که همیشه و در تمام سیستم ها میتواند ثابت باشد !!

در این مورد اطلاعات ندارم ، اگه ممکنه کامل تر بگید

فعلا چون دیر میشه تا منتظر جواب باشم ، ریپورت هامو منتقل کردم (مابقیشم هم تا یکی دو روز دیگه تمومه) به دیتاست و دیتاست رو به گزارشم پاس میدم ، یکم کارم سخت شده ولی سرعتش تفاوتی نکرده (کویری ها رو StoredProcedure کردم) ولی در کل خوشحال میشم راه حل مشکلم رو بدونم .

saeedsa
سه شنبه 11 مرداد 1390, 17:07 عصر
در اینجا دو حال پیش می آید یا گزارش subreport , هست یا داکیومنت معمولی
ابندا باید داکیومنت گزارش و کانکشن اینفو را به توابع بدهد
نحوه پر کردن connectionInfo





ConnectionInfo ConnectionInfoRpt = new ConnectionInfo();
ConnectionInfoRpt.IntegratedSecurity = true;
ConnectionInfoRpt.DatabaseName = "database";
ConnectionInfoRpt.Password = "pass";
ConnectionInfoRpt.UserID = "user";
ConnectionInfoRpt.ServerName = SystemInformation.ComputerName.ToString();
Finassl rpt = new Finassl();



حالا نوبت به ارسال هم داکیومنت و کاننکشن است


ApplyLogOnInfoForSubreports(rpt, ConnectionInfoRpt);


تابع را فراخوانی می کنیم

private void ApplyReportLogon(CrystalDecisions.CrystalReports.E ngine.ReportDocument RptYears, ConnectionInfo sa)
{
foreach (CrystalDecisions.CrystalReports.Engine.Table tablex in RptYears.Database.Tables)
{
tablex.LogOnInfo.ConnectionInfo.AllowCustomConnect ion = true;
TableLogOnInfo tablelog = tablex.LogOnInfo;
tablelog.ConnectionInfo = sa;
tablex.ApplyLogOnInfo(tablelog);
}
}


حال اگر فرم شما ساب ریپورت داشته باشد فرم ریپورت خود را به جای ارسال به تابع فوق به تابع زیر ارسال می نمایید


private void ApplyLogOnInfoForSubreports(CrystalDecisions.Cryst alReports.Engine.ReportDocument rpt, ConnectionInfo ConnectionInfoRpt)
{


Sections Sections = rpt.ReportDefinition.Sections;
foreach (Section section in Sections)
{
ReportObjects reportObjects = section.ReportObjects;
foreach (ReportObject reportObject in reportObjects)
{
if (reportObject.Kind == ReportObjectKind.SubreportObject)
{
var subreportobject = (SubreportObject)reportObject;
ReportDocument SubReportDocument = subreportobject.OpenSubreport(subreportobject.Subr eportName);
ApplyReportLogon(SubReportDocument, ConnectionInfoRpt);
}
}
}


}













امیدوارم تونسته باشم مشکلی را حل کرده باشم