1.
default(T) 在泛型编成中如果不限制T类型参数是值类型或引用类型的话 你程序内部可能会出现错误,
因为值类型不允许NULL.所以default用来获取一个类型的默认值,对于值类型得到new T() 基本得到的都是0;
对于引用类型会得到Null
或者你不使用Default关键词,自己通过反射得到T是指类型还是引用类型 然后设置默认值
例子:/// <summary>
/// 逆序列化对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json">Json字符串</param>
/// <param name="log">如有log传入log对象,没有为null</param>
/// <returns></returns>
public static T DeserializeObject<T>(string json,ILog log)
{
try
{
T obj = JsonConvert.DeserializeObject<T>(json);
return obj;
}
catch (Exception ex)
{
if (null != log)
{
log.Error("DeserializeObject ["+typeof(T).FullName +"] Error",ex );
}
}
return default(T);
}
2.
fetch next from @Cur into newtable
循环从表@cur中取出,并插入新表中
3.
存储过程 SET NOCOUNT ON:
当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。
如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
4.
强制类型转换
cast(column_name as varchar2(20))之类的
5.
1.传入的参数,只有验证通过了并且要参数化,不可用sql拼接的参数,才允许进入数据库,目的防止sql注入,减少与数据库的接触,节省资源
2.从库中查出的数据,只是看有没有数据的,不要转化成dt,要用ExecuteScalar,只读取第一行第一列
3.在数据库中是什么类型,在定义实体时也要用什么类型,很简单的道理,在与数据库打交道时,很容易被sql注入
注意:uid 数据类型为int
eg:
int re = -1;
//string sql = string.Format("select id from T_Users where id={0} and ISNULL(passport,‘‘)= ISNULL(‘{1}‘,‘‘) ", uid, passport);
//DataTable dt = Shove.Database.MSSQL.Select(sql, new Shove.Database.MSSQL.Parameter[0]);
//if (dt != null && dt.Rows.Count > 0) re = Convert.ToInt32(dt.Rows[0]["id"]);
//return re;
if (string.IsNullOrEmpty(passport))
return re;
string sql = @"SELECT id FROM t_users WHERE id [email protected] AND [email protected]";
MSSQL.Parameter[] par=new MSSQL.Parameter[]{
new MSSQL.Parameter("id",SqlDbType.BigInt,0,ParameterDirection.Input,uid),
new MSSQL.Parameter("passport",SqlDbType.NChar,38,ParameterDirection.Input,passport)
};
object ret= Shove.Database.MSSQL.ExecuteScalar(sql, par);
if (ret != null)
return Convert.ToInt32(uid);
else
return re;
6.
要把加log,成为一种习惯,要颠覆之前的只有调试才能找到错误点,学会从log中读取信息找出造成错误的点
技术小结