C++,有点遥远了.上周因为烤鸭的诱惑,所以帮一个同事弄了个C++的小程序.很久没有碰C++了,感觉很生疏,再就是C++的编译器让我感觉很头痛,虽然有很多的选择,但是真正用起来的时间,总是有中不知所措的感觉.
C++和.net,java比较起来,可以说是简洁而不简单.自己对C++也只能说是入门而已,本来就有打算重新折腾下的.C++中的.h给人的印象还是很深刻的,只是定义..net里面的接口应该就是从这里得到的灵感.不过C++更彻底了一些.上帝的归上帝.
我觉得C++和.net还是比较适合我的,java经过现在的项目,稍微有些阴影了.后面一段时间还要来对应.不过可以没事利用这段时间折腾下C++.特别是那个Boost C++ Libraries.
ReSharp是VS的一个很好用的插件,通过这个可以对代码进行优化,更符合标准。但是ReSharp的内存占用太疯狂了。用ReSharp主要用的就是他的代码优化,和快速Nunit测试了。其他的一些功能都可以省略掉的。
其中最让人感觉郁闷的就是ReSharp的智能感应了。感觉还没有VS的好。所以我们还是返回VS的吧。具体的方法是:
启动VS2005 ReSharp->Options->General 取消智能感知
然后就是开启VS的只能感知了。
DateTime的ToString方法挺方便的,但是其中的格式字符串太多了,搜集了一下,
在这里记录一下。
d 月中的某一天。一位数的日期没有前导零。
dd 月中的某一天。一位数的日期有一个前导零。
ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义。
dddd 周中某天的完整名称,在 DayNames 中定义。
M 月份数字。一位数的月份没有前导零。
MM 月份数字。一位数的月份有一个前导零。
MMM 月份的缩写名称,在 AbbreviatedMonthNames 中定义。
MMMM 月份的完整名称,在 MonthNames 中定义。
y 不包含纪元的年份。如果不包含纪元的年份小于 10,
则显示不具有前导零的年份。
yy 不包含纪元的年份。如果不包含纪元的年份小于 10,
则显示具有前导零的年份。
yyyy 包括纪元的四位数的年份。
gg 时期或纪元。如果要设置格式的日期不具有关联的时期或纪元字符串,
则忽略该模式。
h 12 小时制的小时。一位数的小时数没有前导零。
hh 12 小时制的小时。一位数的小时数有前导零。
H 24 小时制的小时。一位数的小时数没有前导零。
HH 24 小时制的小时。一位数的小时数有前导零。
m 分钟。一位数的分钟数没有前导零。
mm 分钟。一位数的分钟数有一个前导零。
s 秒。一位数的秒数没有前导零。
ss 秒。一位数的秒数有一个前导零。
f 秒的小数精度为一位。其余数字被截断。
ff 秒的小数精度为两位。其余数字被截断。
fff 秒的小数精度为三位。其余数字被截断。
ffff 秒的小数精度为四位。其余数字被截断。
fffff 秒的小数精度为五位。其余数字被截断。
ffffff 秒的小数精度为六位。其余数字被截断。
fffffff 秒的小数精度为七位。其余数字被截断。
t 在 AMDesignator 或 PMDesignator 中定义的 AM/PM
指示项的第一个字符(如果存在)。
tt 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项。
z 时区偏移量(“+”或“-”后面仅跟小时)。
一位数的小时数没有前导零。
例如,太平洋标准时间是“-8”。
zz 时区偏移量(“+”或“-”后面仅跟小时)。
一位数的小时数有前导零。
例如,太平洋标准时间是“-08”。
zzz 完整时区偏移量(“+”或“-”后面跟有小时和分钟)。
一位数的小时数和分钟数有前导零。如,太平洋标准时间是“-08:00”。
: 在 TimeSeparator 中定义的默认时间分隔符。
/ 在 DateSeparator 中定义的默认日期分隔符。
% c 其中 c 是格式模式(如果单独使用)。
如果格式模式与原义字符或其他格式模式合并,则可以省略“%”字
符。
\ c 其中 c 是任意字符。照原义显示字符。若要显示反斜杠字符,
请使用“\\”。
最近在忙公司的一个软件的测评,两天都是在陕西软件评测中心过的,好无聊,下午回到公司写了一个计算年龄的函数。哎!赶紧结束吧。发现最近好久没更新技术的东西了,懒惰啊!
[coolcode lang="C#"]
///
/// 年齢の決算
///
///
///
private int Age(string seiymd)
{
int Seiy = Convert.ToInt32(seiymd.Substring(0, 4));//年
int Seim = Convert.ToInt32(seiymd.Substring(5, 2));//月
int Seid = Convert.ToInt32(seiymd.Substring(8, 2));//日 int nowyr = DateTime.Today.Year;//今の年
int nowmh = DateTime.Today.Month;//今の月
int nowd = DateTime.Today.Day;//今の日
int year=nowyr-Seiy;
if (year > 0)
{
if (nowmh - Seim < 0)
{
year–;
return year;
}
if ((nowmh == Seim) && (nowd - Seid < 0))
{
year–;
return year;
}
}
else
{
year = 0;
}
return year;
}
[/coolcode]
ADO.Net是.NET平台里面最吸引人的地方了。最近参加了一个项目,由于客户要求新增一块。类似的模块已经有了,数据验证和导入。但是看过代码之后发现真的很慢,很多地方是用生成SQL语句来完成的。这样效率很低。所以自己决定用ADO.NET来完成这一任务。
我以前对ADO.NET的理解是:通过这个你可以很方便的处理大量的数据,而不用去和数据库大太多的交道,它可以避免经常的对数据库操作。她是把数据库中的数据先放入服务器中,不直接对数据库操作。另外一点就是效率很高。但是如何去实施,自己真的很不了解。
下面是自己经过三天项目后,自己通过MSDN等资料,收获的一些东西
从数据库中利用ADO.NET读取数据放入DataTable以后,最好给DataTable设置一个主键,这样在以后的调用中就可以使用列名来取某一列了。
foreach (DataRow dr in Tables["sample"].Rows)
{
dr.Columns[0]="";
}
这样操作一定很不爽,用数字来标识列会让人陷入迷茫中的。特别是列数多的时间。
但是如果给DataTable设置主键了以后,你就可以使用dr.Columns["id"]来访问数据了。
这样会方便许多,而且后期的维护也会简单很多。
ds.Tables["test"].PrimaryKey = new DataColumn[] { ds.Tables["test"].Columns[0] };
这样之后你就可以随心所欲了。
另外就是DataTable中每列的数据类型,在填充数据以后就不可以更改的。所以这点上应该小心一些。
利用DataSet来更新数据库的时间也是很简单的,
SqlCommand cmd = new SqlCommand(SQLStr, conn);
SqlDataAdapter da = new SqlDataAdapter();
da.UpdateCommand = cmd;
da.Update(ds, "old");
一般这样就可以解决问题了,当然了,数据类型一定要一直。至于不一致的时间可以使用cmd.Parameters.Add()来指定。建议最好不管什么操作,都给相应的Command指定一个SqlCommand,以防万一。
还有很多收获,ADO.NET还是个很好的东西的。最近在看IBatIs.net可以说是ADO.net的一个扩充。英文资料太费脑子了。郁闷!
接触.NET这段时间来,对.NET还是比较看好的,至少他在很多方面做的的确很好。ADO.NET就是做的最出色的了。方便,快捷。DataSet是ADO的核心了,其实程序本身的速度可能都不错的,但是和数据库扯上关系的时间就复杂了。数据库的打开和链接将会耗费大量的时间和资源,而有了这个一切都变得轻松起来了。
今天上午把下个项目的环境配置了一下,可是下午被丁姐喊去处理上个项目遗留的问题,客户需求变更了。要添加一个模块。让我和何一块在两周之内把这块搞定。中间有一块数据的导入,自己可能要做这个了。自己当时说了一句,我尽量努力吧,丁姐给我来句,这可是正式的项目,别尽量,一定要做出来。我当时那个寒啊!是啊,这应该算是自己做的第一个真正和用户接触的项目了,以前做的那两个都是练习的。现在是真刀真枪的开干了。然后就是坐在那里思考自己应该怎么做了。然后就是大家商量大概应该怎么样完成了。
其实功能的实现倒不是主要的问题,主要是效率。他们已经完成了一个类似的模块,但是在大量数据的导入时间,效率太差了。看代码发现主要是他们把数据先读入到数据库中,觉得这样做肯定很慢。打算用DataSet来做这一块。思路就是把数据库中需要比对的数据读入到DataSet中的一个table中,本地导入的数据也导入到一个table中,提取datarow进行比对。这样应该可以节省下来不少时间的,而且实现起来应该也不错的。
DataSet的使用办法其实很简单,但是其中包含太多太多的东西了。在.NET3.0中添加的LINQ会使DataSet更加强大,可是现在只能够使用2.0。痛苦啊。言归正传,DataSet的一般如使用方法如下。
第1步,创建到数据源的连接:
SQLConnection con =new SQLConnection(”server=localhost;uid=sa;pwd=;database=pubs”);
第2步,创建DataSetCommand对象,指定一个存储过程的名字或者一个SQL语句,指定数据链路;
SQLDataSetCommand cmd =new SQLDataSetCommand(”SELECT * FROM Authors”, con);
第3步,创建一个Dataset对象
DataSet ds = new DataSet();
第4步,调用DataSetCommand的FillData方法,为Dataset填充数据。 注意:数据链路没有必要是打开的。如果数据链路是关闭状态,FillData函数会打开它,并在FillData之后关闭数据链路。如果数据链路本来就是打开的,在FillData之后,数据链路依然保持打开状态。
int iRowCount = cmd.FillDataSet(ds, “Authors”);
第5步,操作数据。由于FillData返回了记录的个数,我们可以构造一个循环,来操纵Dataset中的数据。
for(int i=0; i< iRowCount; i++){
DataRow dr = ds.Tables[0].Rows[i];
Console.WriteLine(dr["au_lname"]);
}
———————-
这两周自己应该会过的很充实了。努力吧!尽量这周之内把大致的内容完成,然后测试和修改。