安装了Sql Server 2005(SQL Server 9.0.1399)后,使用Round函数出现如下的一个小Bug:
继续执行发现了同样的问题:
该问题在SQL2000中不存在,在SQL2005升级到SP1后仍然存在。
<connectionStrings>
<add name="cc_2005" connectionString="Data Source=cc;Initial Catalog=cc_2005;Integrated Security=True" providerName="System.Data.SqlClient"/>
<add name="cc_2006" connectionString="Data Source=cc;Initial Catalog=cc_2006;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
public class GetSqlConnection
{
public static string SqlStr;
public GetSqlConnection()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
}
//选择年份,返回选择的数据库
private void GetSqlStr()
{
if (lblLoginYear.Text == "2005年度")
{
GetSqlConnection .SqlStr= ConfigurationManager.ConnectionStrings["cc_2005"].ConnectionString;
}
else if (lblLoginYear.Text == "2006年度")
{
GetSqlConnection.SqlStr = ConfigurationManager.ConnectionStrings["cc_2006"].ConnectionString;
}
else
GetSqlConnection.SqlStr = null;
}
<asp:SqlDataSource ID="SqlDataOrder" runat="server" ConnectionString="<%# GetSqlConnection.SqlStr %>" SelectCommand="SELECT * FROM [Order]" ></asp:SqlDataSource>
最后运行程序,显示“ConnectionString 属性尚未初始化”,说明ConnectionString并没有接收到变量值,查找分析后发现<%# %>这种绑定是在该控件执行数据绑定后才会执行,用以下代码即可:
protected void Page_Load(object sender, EventArgs e)
{
SqlDataOrder.DataBind(); //或者用:Page.DataBind();
} 这样ConnectionString才接收到数据库连接字串值,程序才正常执行,当然也可能在.CS中直接指定
SqlDataOrder.ConnectionString = GetSqlConnection.GetSqlDb();
总之这样可以实现动态设置数据库的连接信息,目前是一个解决方法,不知有没有更好的。
con = new SqlConnection(Session["SQLCONNECTION"].ToString());
strSql = "SELECT * FROM htOrder";
scm = new SqlCommand(strSql, con);
sda = new SqlDataAdapter(scm);
ds = new DataSet();
sda.Fill(ds, " order ");
rptOrder.SetDataSource(ds.Tables["order"]);
crOrder.ReportSource = rptOrder; 
//绑定报表数据
private void BindCrystalReports()
{
string path1 = Server.MapPath("~\\Report\\");
string path2 = path1 + "repOrder.rpt";
ReportDocument repDoc = new ReportDocument();
repDoc.Load(path2);
SetDBLogonForReport(repDoc); //设置数据登录信息
crOrder.ReportSource = repDoc;
string selectionFormula = "{htOrder.htID} =" + txtHtID.Text.Trim();//设置报表数据筛选公式
repDoc.DataDefinition.RecordSelectionFormula = selectFormula;
crOrder. DataBind ();
}
//设置登录信息
private void SetDBLogonForReport(ReportDocument reportDocument)
{
try
{
ConnectionInfo connectionInfo = new ConnectionInfo();
connectionInfo.ServerName = ConfigurationManager.AppSettings["ServerName"];
connectionInfo.DatabaseName = ConfigurationManager.AppSettings["DatabaseName"];
connectionInfo.UserID = ConfigurationManager.AppSettings["UserID"];
connectionInfo.Password = ConfigurationManager.AppSettings["Password"];
Tables tables = reportDocument.Database.Tables;
foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
{
TableLogOnInfo tableLogonInfo = table.LogOnInfo;
tableLogonInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo(tableLogonInfo);
}
}
catch
{
lblNote.Text = "<script>alert('数据库登录信息不正确!');</script>";
}
}
1. 建立水晶报表,注意报表要用OLE DB ADO方式连接数据源,这样可以省去报表登录窗口的弹出。
2. 在设计视图中拖拉报表控件CrystalReportViewer,点击右上角智能标签设置报表数据源,选择报表文件,自动生成CrystalReportSource,这时在设计视图中将显示出报表界面,水晶报表将自动用初始数据填充报表字段。注意这里有个小Bug,如果报表在子目录中,选择报表文件将自动用相对路径表示,这时报表显示会出错,应改成绝对路径才可以。
<Report FileName="report\rptOrder.rpt">这里应改成:<Report FileName="..\report\rptOrder.rpt">
3.拖拉一个数据源控件SqlDataSource(也可以用ObjectDataSource),按向导生成数据源,这里可以筛选数据,根据情况选择各类数据源。
4.如何将CrystalReportSource与SqlDataSource两个控件连接在一起呢?可以这样:选择CrystalReportSource控件点击右侧属性中数据栏,再点击Report选择DataSource,在这个数据源集合编辑器选择数据源指定报表名称即可。(下面的Parameters是用来选择报表参数用的)
经过这几个步骤,就可以运行程序显示报表啦,怎么样不用写一句代码吧?
具体代码可参考如下:
<CR:CrystalReportViewer ID="crOrder" runat="server" AutoDataBind="True" ReportSourceID="ReportSourceOrder" BestFitPage="False" DisplayToolbar="False" DisplayGroupTree="False" Height="1042px" Width="775px" EnableParameterPrompt="False" />
<CR:CrystalReportSource ID="ReportSourceOrder" runat="server">
<Report FileName="..\report\rptOrder.rpt">
<DataSources>
<CR:DataSourceRef DataSourceID="SqlDataSourceOrder" TableName="htOrder" />
</DataSources>
</Report>
</CR:CrystalReportSource>
<asp:SqlDataSource ID="SqlDataSourceOrder" runat="server" ConnectionString="<%$ ConnectionStrings:cc_2005 %>"
SelectCommand="SELECT * FROM [htOrder] "></asp:SqlDataSource>