近几日工作笔记整理
一、C#中如何让两个timer控件同时运行
Timer,其实是使用了线程的异步调用,既然线程可以并发,那么Timer是可以同时调用Start()的。
二、静态函数与非静态函数
查不同贴子,找到 下面不同解说,我认为,不同方面各有道理:
解说一:在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别
如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。
静态方法和实例化方式的区分是为了解决模式的问题。
解说二:静态只是少了一次构造而已 没有什么谁高谁低
只是有些类 这个类他在世界上不具备很多实体对象,那就是这么一个类
比如数学方面的计算,你需要创建多个对象吗? 不需要 他就在那 所以静态。
而人 则需要动态创建 很多人 每个人都不一样
解说三:静态就象做烧饼,先做好了卖的时候直接卖,卖的时候省事。非静态有点像做煎饼,做一个买一个,不糟践。
解说四:有点差别 是实例方法的第一个参数是 this指针,静态方法没有this指针参数
解说五:对象的实例化指的是对象数据的实例化,而不是对象本身的实例化
也就是创建一个对象,需要实例化的是对象的数据,而不是对象的成员方法
不管什么对象在内存都是通过代码段和数据段来分开存储的,这两个东西是分开的,所谓的面向对象只是对用户的展现形式,并不是系统底层的真是情况,对cpu来说没有任何的对象,只有代码和数据。
所以对象的方法本身在内存中只有一个副本,不管是否创建对象的实例始终存在与程序的代码空间
静态方法不需要创建类的实例即可直接调用
实例方法需要依赖类的实例才能调用,调用前增加了创建实例的开销,如果不考虑对象的创建(比如对象只创建一次),则调用静态方法和实例方法的速度是一样的。
三、类静态变量
在类中定义公共静态变量,在内存中固定地址,不会变,不用实例化。可以一次赋值后长时间保存。值供不同类间使用都可以。
若在类中定义普通公共变更,则用的时候需要实例化此类,这些每一次实例化都会在内存中开辟一个新地址和空间以供使用,每次实例化就相当于新的变量,需要新赋值。
四、Oracle批量入库
用update 或blukcopy。
update示例:
DataTable dt2 = new DataTable();
OracleDataAdapter da = new OracleDataAdapter();
da.SelectCommand = new OracleCommand();
da.SelectCommand.Connection = DbService.GetOracleConn();
da.SelectCommand.CommandType = CommandType.Text;
da.SelectCommand.CommandText = "select * from cmn_t_position_history where 1=2";
try
{
da.Fill(dt2);
foreach (DataRow dr in dt.Rows)
{
dt2.Rows.Add();
int count = dt2.Rows.Count;
dt2.Rows[count - 1]["device_type"] = dr["device_type"].ToString();
dt2.Rows[count - 1]["device_id"] = dr["device_id"].ToString();
dt2.Rows[count - 1]["location_time"] = Convert.ToDateTime(dr["location_time"].ToString());
dt2.Rows[count - 1]["location_x"] = dr["location_x"].ToString();
dt2.Rows[count - 1]["location_y"] = dr["location_y"].ToString();
dt2.Rows[count - 1]["def_location_x"] = dr["def_location_x"].ToString();
dt2.Rows[count - 1]["def_location_y"] = dr["def_location_y"].ToString();
}
OracleCommandBuilder ocb = new OracleCommandBuilder(da);
try
{
num = da.Update(dt2);
if (num > 0)
{
sb.Clear();
sb.AppendFormat("update cmn_position_info set s_flag='{0}' where s_flag='{1}'", "1", "0");
msg = DbService.ExecuteSqliteSql(sb.ToString());
}
}
catch (SQLiteException ex)
{
LogHelper.LogHelper.RecordLog(0, ex.Message);
return ex.Message;
}
blukcopy示例:
OracleBulkCopy bulkCopy = new OracleBulkCopy(connstr, OracleBulkCopyOptions.Default);
bulkCopy.DestinationTableName = "CMN_T_POSITION_HISTORY";
bulkCopy.BatchSize = dt_cj_zflocation.Rows.Count;
try
{
if (dt_cj_zflocation != null && dt_cj_zflocation.Rows.Count != 0)
bulkCopy.WriteToServer(dt_cj_zflocation);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (bulkCopy != null)
bulkCopy.Close();
}