PDA

View Full Version : کریستال ریپورت ، SQL Server ، وی بی دات نت



hamed_bostan
چهارشنبه 22 تیر 1384, 01:50 صبح
سلام . من یه connection ساخنم و با اون به sql وصل می شم و insert,update و... رو انجام می دم و مشکلی هم نداره اما حالا که می خوام لا کریستال ریپورت از table داخل sql یپورت بگیرم پنجره login باز می شه و login error می ده و دسترسی نداره . با بانک access این مشکلات رو ندارم . کمکککککککککککککککککک

zeus
چهارشنبه 22 تیر 1384, 03:00 صبح
sql یه بانک داده بزرگ و درعین حال امنه شما باید قبلا به عنوان یه user اونجا تعریف شده باشی که مثلا اجازه دسترسی به یه بانک داده رو داشته باشی و...

Hamedm
چهارشنبه 22 تیر 1384, 12:15 عصر
سلام

ببین این پیغام عادیه و برای همه میاد شما میتونی از طریق کد زیر این پیغامو برداری:

Dim mylogOnInfo As New CrystalDecisions.Shared.TableLogOnInfo

With mylogOnInfo
.ConnectionInfo.ServerName = ServerName
.ConnectionInfo.DatabaseName = DatabaseName
.ConnectionInfo.UserID = "sa"
.ConnectionInfo.Password = Password
End With
این کد رو در Form_load گزارشت قرار بده.

در پناه حق موفق باشید و پرتوان

mehrdotnet
چهارشنبه 22 تیر 1384, 18:11 عصر
سلام
جواب Hamedm کاملا درسته. من پیشنهاد می کنم موارد مورد نیاز توی کد بالا از طریق Dynamic Pripertyها توی فایل config برنامه به صورت یک کلید ذخیره اش کنی تا وقتی exe برنامه ات رو یک جای دیگه می بری بتونی راحت اونا رو بدون نیاز به سورس تغییرش بدی.

hamed_bostan
چهارشنبه 22 تیر 1384, 20:10 عصر
اولا که ممنونم از همه روستان که جواب دادن . دوما اگر sa پسورد نداشته باشه چی؟ دوما mehrdotnet عزیز اگه میشه یه خورده بیشتذ توضیح بدین؟ اگه نخوام از sa استفاده کنم چی؟

باز هم ممنونم دوستان

mehrdotnet
یک شنبه 26 تیر 1384, 01:31 صبح
باز هم سلام
اولا اگر sa پسورد نداشته باشه می تونی یا قسمت مربوط به اون رو اصلا وارد نکنی یا اینکه پسورد را مساوی "" قرار بدی (یعنی خالی)
برای دوما هم باید بگم که اولا شما برای اینکه بخواین یک ارتباط بین برنامه تون با SQL Server برقرار کنید نیاز به یک User توی SQL Server دارین که حق دسترسی به منابع مورد نظر داشته باشه و شما بتوانید از طریق اون از برنامه به پایگاه لاگین کنین و از اون استفاده کنین. sa یک کابر پیش فرضه که توی تمام SQL Server ها وجود داره و هنگام نصب SQL ساخته و پسورد دهی می شه. این User بطور پیش فرض به همه منابع موجود در SQL دسترسی داره.

به هر حال شما باید حتما برای دسترسی به منابع SQL یک User توی اون داشته باشین شما مجبور نیستین حتما از sa استفاده کنین بلکه می تونین خودتون به هر تعداد که می خواین توی SQL یوزر بسازین و برای اونها سطح دسترسی تعیین کنین البته باید این رو دقت کنین که اگه DB برنامه رو به SQL Server دستگاه دیگری انتقال دادین مجبورید دوباره این User را با همون سطح دسترسی توی اون تعریف کنین. پس می بیبنید که آسون ترین راه استفاده از sa هستش که روی تموم سیستم های دارای SQL موجوده.

دلیل اینکه می گم از Dynamic Property ها استفاده کنین اینه که اگه شما برنامه تون را به یک شبکه دیگه منتقل کنین Server Name شما ممکنه تغییر کنه و یا اگه یک User با همون سطح دسترسی مورد نظر شما روی DB Server وجود داشته باشه و بخواین از اون استفاده کنین ، در صورتی که برنامه بدون DProperty نوشته شده باشه و بخواین این تغییرات رو اعمال کنین باید مجددا سورس رو باز کرده دستکاری کنین و دوباره اسمبلی اون رو رو سیستم ها نصب کنین بنابراین در ازای هر تغییر نیاز به دستکاری سورس دارین. مثلا فرض کنین که شما اسم سیستم تون MySys باشه و روی سیستم خودتون توی SQL یوزری به نام mmuser دارین و از اون استفاده کردین. حالا اگه برنامه تون رو به دوستتون بدین تا روی سیستم خودش نصب کنه و یا یانک اطلاعاتی تون رو توی یک شبکه روی سیستم دیگه ببرین دیگه اسم سیستم MySys نیست و یا اگه دوستتون بخواد از ّfriend1 که سطح دسترسی به بانک داره استفاده کنه باید بره سورس رو تغییر بده.

استفاده از Dynamic Property ها این کار رو بسیار راحت می کنه چون مواردی که Dynamic تعریف می شه توی فایل Config برنامه مقدارشون ذخیره می شه.

مثلا اگه بخواین text یک label رو به صورت Dynamic تعریف کنین. می تونین کد زیر را در قسمت appSettings فایل Config کد زیر رو بنویسین :

add key="KeyName" value=yourvalue

این کد یک کلید را داخل فایل Config می سازه و شما می تونین هر جای برنامه که بخواین از اون استفاده کنین مثلا اگه بخواین مقدار این کلید را توی یک Label بنویسید ، کافیه داخل برنامه جای مورد نظرتون کد زیر رو وارد کنید :

Dim configurationAppSettings As System.Configuration.AppSettingsReader = New System.Configuration.AppSettingsReader
LabelName.Text = CType(configurationAppSettings.GetValue("KeyName", GetType(System.String)), String)


با این کار مقداری که توی فایل Config مشخص کرده بودین قابل دسترسی است. و از طرفی فایل Config برنامه فایلی که به راحتی توسط ساده ترین Text Editor ها مثل NotePad قابل باز کردن و تغییر دادنه.
پس اگه شما Server Name رو هم به صورت Dynamic Property تعریف کنین پس از انتقال برنامه کافیه مقدار کلید جدید اون رو توی فایل Config تغییر بدین و نیازی به سورس ندارین.

ببخشین که سرتون رو درد آوردم امیدوارم این توضیحات کافی باشه.

hamed_bostan
چهارشنبه 23 شهریور 1384, 08:55 صبح
فوق العاده از همگی منونم

hmm
چهارشنبه 23 شهریور 1384, 09:40 صبح
استفاده از فایل config به دلیل اینکه همه میتونن این فایل رو باز کنن و رمز اصلی سیستم رو بخونن از امنیت کافی برخوردار نیست بهرتره از یه یوزر و پسورد خاص استفاده بشه که دیگه مشکلی پیش نیاد

saeedsa
سه شنبه 11 مرداد 1390, 17:14 عصر
در اینجا دو حال پیش می آید یا گزارش 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);
}
}
}


}













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