随笔 - 5  文章 - 0 评论 - 8 trackbacks - 7

安装了Sql Server 2005(SQL Server 9.0.1399)后,使用Round函数出现如下的一个小Bug:

继续执行发现了同样的问题:

该问题在SQL2000中不存在,在SQL2005升级到SP1后仍然存在。

posted @ 2006-05-24 21:41 一代风华 阅读(413) 评论(5) 编辑
        在.Net2.0中增加了新的数据库连接字符串的绑定语句," ConnectionString="<%$ ConnectionStrings:SomeValue %>",我在一个项目中遇到这样一个问题,一套系统有两个结构一样的Sql Server数据库,这两个数据库共用一个系统代码,如何在设计中动态的选择数据库连接信息登录相应的数据库呢?例如在Web.config中有如下的设置:

 <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>

        那么如何在页面视图中如何动态的选择这个连接字符串呢?首先ConnectionString="<%$ ConnectionStrings:SomeValue %>"不支持数据绑定,那么我想到用ConnectionString="<%# ConnectionStrings:SomeValue %>"这个数据绑定,因此增加一个静态类变量,用来返回登录的数据库连接信息,代码如下:

public class GetSqlConnection
{
       
public static string SqlStr;
       
public GetSqlConnection()
    
{
           
//
           
// TODO: 在此处添加构造函数逻辑
           
//
          }

    
}

        在首页Login.aspx登录页面的代码:
//选择年份,返回选择的数据库
    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(); 
        总之这样可以实现动态设置数据库的连接信息,目前是一个解决方法,不知有没有更好的。


 

posted @ 2006-05-23 18:58 一代风华 阅读(2827) 评论(1) 编辑
        今天照例去做合同管理这个项目的升级、转换工作,将原来VS2003的旧项目转成新的VS2005中去,分析了几天,一些转换的代码和步骤已大致了解,接下来的是痛苦的转换工作,增、删、改好不累人。最烦人的是原来项目中运用了大量的水晶报表,新的VS2005水晶报表升级成了10.2.3600,原来的强类型报表组件在页面视图中已不再支持,凡是用到水晶报表的都得改,真TMD的痛苦。其实不去做这个转换也罢,系统也照样运行的。但我的原则就是做事要做到位,做最新的,做最好的,那么你也要付出最大的努力。

        原来的项目基本上已做得差不多了,下面是统一系统的登录界面,将原来几个年度几个类型的合同管理登录界面统一到一起来,这个又要做网页,做美工了,好久没有做这方面工作了,近期都放在程序和数据库上了,唉,既要做后台,又得做界面,真的很累的。
        想起来也真好笑,原来是做会计的,后来又去实施财务软件,再后来又转到网络维护、网站设计上去了,现在又搞起WEB编程了,改来改去自己也不知道做什么好,我知道什么都学,终究是什么都学不好,有所为还要有所不为。现在在岗位上那有时间去系统的学习掌握一些原理,打好一些基础呢?还不是用什么学什么,浅尝辄止,蜻蜒点水而已,充其量做个小项目,搞个小系统而已。但在系统设计和应用开发的实践中也感悟到不少东西,影响最深的就是系统的实施和布署了,以前只知道开发有难度、编程太深奥,却那知系统应用和实施更加难烦,用户的期望是永远难以达到的……。
 
       想来也只是感叹了,做什么由不得自己,想什么不容多虑。但行好事,莫问前程吧!
       
posted @ 2006-05-22 20:51 一代风华 阅读(192) 评论(1) 编辑
      之前在论坛中经常有人问起在VS2005中使用水晶报表(Crystal Report 10)如何用DataSet实现动态的数据源绑定?关于这个问题我研究了一下,找到了新的解决方案。
    在以前VS2003中可以采用PUSH模式推报表,可以用如下的代码实现:       
   

         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;    

         
        VS2005中不再支持“embedded report”嵌入式报表,只能采用非嵌入式报表的方法拉数据,下面是典型的代码:
        

    //绑定报表数据
            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>";
           }

}

                  
        这种方式是不是太频繁琐了,在数据结构更改或者查询条件发生变化时必须要再次更改报表设置,那么在VS2005中水晶报表有没有更简洁的方法呢?最好不用写代码就能搞定呢?有,那就是新的数据绑定控件CrystalReportSource,这个控件与SqlDataSource数据源绑定控件一起连用就可以用SQL表达式作数据源推数据了。下面是实现的步骤:

        1. 建立水晶报表,注意报表要用OLE DB ADO方式连接数据源,这样可以省去报表登录窗口的弹出。
        2. 在设计视图中拖拉报表控件CrystalReportViewer,点击右上角智能标签设置报表数据源,选择报表文件,自动生成CrystalReportSource,这时在设计视图中将显示出报表界面,水晶报表将自动用初始数据填充报表字段。注意这里有个小Bug,如果报表在子目录中,选择报表文件将自动用相对路径表示,这时报表显示会出错,应改成绝对路径才可以。
            <Report FileName="report\rptOrder.rpt">这里应改成:<Report FileName="..\report\rptOrder.rpt">
        3.拖拉一个数据源控件SqlDataSource(也可以用ObjectDataSource),按向导生成数据源,这里可以筛选数据,根据情况选择各类数据源。            
        4.
如何将CrystalReportSourceSqlDataSource两个控件连接在一起呢?可以这样:选择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>

 

posted @ 2006-05-21 10:49 一代风华 阅读(6594) 评论(1) 编辑
        公元二零零六年五月二十日,我的博客终于诞生了------http://vs2008.cnblogs.com/,在博客园IT专栏中安家了。呵呵!虽然早就有这个打算但一直未能实现,今天终算是如愿意偿啦。我博因我在!WEB2.0时代博客为王,我要因此而博上一回。
    
         此前总是在众多的论坛中爬网,在博客园中穿行,学到了许多,也遗忘了许多,在这里我要把我的点滴感受、心得体会写在这里。先有准确的定位,之后才有精彩的创意。相信我会在这里找到我的方向,实现我的梦想,我会好好努力的。

 

posted @ 2006-05-20 20:55 一代风华 阅读(95) 评论(1) 编辑
仅列出标题