ปัญหาในการเปลี่ยนแหล่งข้อมูล Crystal Report ในรหัส

ฉันมีแอปพลิเคชัน .net 3.5 SP1 ที่มีรายงานคริสตัลแบบฝังอยู่จำนวนหนึ่ง (เวอร์ชัน 10.5) รายงานจะทำงานได้ดีใน dev ของฉัน สภาพแวดล้อม แต่เมื่อฉันย้ายรหัสไปที่การใช้งานจริง ผู้ใช้จะได้รับหน้าต่างที่ขอข้อมูลรับรองการเข้าสู่ระบบ

ตอนนี้ฉันรู้แล้วว่าคำถามเกี่ยวกับวิธีการเปลี่ยนแหล่งข้อมูล ณ รันไทม์ได้ถูกถามและตอบหลายครั้งใน SO คำถามของฉันไม่ใช่จะทำอย่างไร แต่ฉันกำลังทำอะไรผิดหรือเปล่า?

สิ่งที่เกิดขึ้นคือหน้าต่างเข้าสู่ระบบจะปรากฏขึ้นพร้อมกับข้อมูลทั้งหมด แต่ฟิลด์ฐานข้อมูลว่างเปล่าและการแก้ไขจะถูกปิดใช้งานในฟิลด์ เมื่อฉันอ่านโค้ดด้วยดีบักเกอร์ ConnectionInfo จะมีข้อมูลที่ถูกต้องทั้งหมด รวมถึงชื่อฐานข้อมูลด้วย

//InvoiceHistory is the crystral report that is an embedded resource
InvoiceHistory billingHistoryReport = new InvoiceHistory();

ConnectionInfo info = ReportUtilities.GetConnectionInfo();
ReportUtilities.ConfigureLogonInfo(billingHistoryReport,info);

crystalReportViewer1.DisplayToolbar = true;
crystalReportViewer1.ReportSource = billingHistoryReport;
crystalReportViewer1.Refresh();


//Static Function Code

public static void ConfigureLogonInfo(ReportDocument _report, ConnectionInfo _conn)
{
    Tables ts = _report.Database.Tables;
    TableLogOnInfo li = new TableLogOnInfo();

    foreach (Table t in ts)
    {
        li = t.LogOnInfo;
        li.ConnectionInfo = _conn;
        t.ApplyLogOnInfo(li);
    }

    for (int i = 0; i < _report.Subreports.Count; i++)
    {
        Tables tbs = _report.Subreports[i].Database.Tables;
        TableLogOnInfo sli = new TableLogOnInfo();

        foreach (Table t in tbs)
        {
            sli = t.LogOnInfo;
            sli.ConnectionInfo = _conn;
            t.ApplyLogOnInfo(li);
        }
    }
}


public static ConnectionInfo GetConnectionInfo()
{
    ConnectionInfo conn = new ConnectionInfo();
    conn.Type = ConnectionInfoType.SQL;
    conn.UserID = GlobalSettings.Default.DatabaseUser;
    conn.ServerName = GlobalSettings.Default.ServerName;
    conn.Password = GlobalSettings.Default.DatabasePassword;
    conn.IntegratedSecurity = GlobalSettings.Default.UseIntegratedSecurity;
    conn.DatabaseName = GlobalSettings.Default.DatabaseName;

    return conn;
}

เมื่อฉันผ่าน VS 2008 และไปที่ Crystal Reports -> Database -> Database Expert -> Properties

Database Type: OLE DB(ADO)
Provider : SQLNCLI10
Data Source: {My dev SQL SERVER SERVER Instance}
Initial Catalog: {My dev DB NAME}
User ID: {My dev User ID}
Integrated Security: false

แก้ไข: หลังจากยกเลิกการเลือก "ตรวจสอบทุกการพิมพ์" ปัญหายังคงเกิดขึ้น


person Scott    schedule 09.10.2011    source แหล่งที่มา


คำตอบ (1)


เพียงตั้งค่าออบเจ็กต์ ConnectionInfo โดยตรงหลังจากล้างการเชื่อมต่อแหล่งข้อมูลปัจจุบัน เปลี่ยนวิธี ConfigureLogonInfo ของคุณเป็นด้านล่าง:

public static void ConfigureLogonInfo(ReportDocument _report, ConnectionInfo _conn)
    {
        _report.DataSourceConnections.Clear();
        foreach(Table tbl in _report.Database.Tables)
        {
            tbl.LogOnInfo.ConnectionInfo = _conn;
        }

        for(int i = 0; i < _report.Subreports.Count; i++)
        {
            var sub = _report.Subreports[i];
            sub.DataSourceConnections.Clear();                
            foreach(Table tbl in sub.Database.Tables)
            {
                tbl.LogOnInfo.ConnectionInfo = _conn;
            }
        }
    }
person Justin    schedule 10.10.2011
comment
จัสติน นี่ไม่ได้ผล ยังคงแสดงหน้าจอเข้าสู่ระบบฐานข้อมูลให้ฉัน - person Scott; 11.10.2011
comment
จัสติน คุณพูดถูกกับ DataSourceConnections.Clear() อย่างไรก็ตามรหัสของคุณผิด คุณต้องโทรหา ApplyLogOnInfo(ConnectionInfo) มิฉะนั้นข้อมูลการเชื่อมต่อใหม่จะไม่ติด ฉันยังต้องติดตั้งไคลเอ็นต์เนทีฟ sql บนเครื่องไคลเอ็นต์ด้วย หากคุณทราบวิธีใดที่ฉันสามารถรวมสิ่งนั้นเข้ากับโปรแกรมได้ ฉันยินดีรับฟัง - person Scott; 13.10.2011