1. DllImport是System.Runtime.InteropServices命名空间下与与非托管相关的一个属性类,负责导出从非托管的dll中导出函数信息,导出的函数在声明时必须有extern修饰;copy的dll文件可以放置在System32目录(在import时可以不写路径)。

2.Marshal类可以实现托管和非托管的相互转换,它的命名空间也是System.Runtime.InteropServices,已用过Marshal.PtrToStringAnsi方法。

3.鼠标钩子WH_MOUSE_LL和WH_MOUSE的区别:

前者可以截获所有模块的鼠标事件,后者只能截获监控钩子所在模块的鼠标事件。全局hook应在一个独立的dll中。

4.解决方案solution里有多个projects,其中一个project用到另一个project里的类,需要在此project中右键add reference,再用using加命名空间的形式添加对类的引用;需要编译成DLL的project,其property的输出类型应为Class Library。

5.往数据库的表中插入新行。

//方法一:用DataAdapter方法,优点:不用写insert语句且不用关心values后边的各字段的形式,如要不要加单引号之类的;缺点:插入一条记录的效率不及写单纯insert语句
    SqlConnection conn = ConnectDB(server, db);
    string sql = "select * from " + tableName;
    SqlDataAdapter da = new SqlDataAdapter(sql, conn);
    SqlCommandBuilder scb = new SqlCommandBuilder(da);//SqlCommandBuilder根据insertCommand构造    updatecommand和deletecommand

    DataTable dt = new DataTable();
    exeTable(conn, dt, sql);
    DataRow dr = dt.NewRow();
    dr.ItemArray = columnValues;
    dt.Rows.Add(dr);

    da.Update(dt);
    conn.Close();
// 方法二:单纯写insert语句插入一条记录,优点:单条数据插入效率高 缺点:需要注意sql语句的构造和sql语句中参数的类型
    string sql = "insert into 表名 values(" + 值1+ "," + 值2+ ",'" + 值3+ "',"+ 值4+ "," + 值5+ "," + 值6+",@参数1,'" + 值7+ "','"+ 值8+ "')";

    SqlParameter param = new System.Data.SqlClient.SqlParameter("@参数1", SqlDbType.Image);
    param.Value = 值9;

    SqlConnection conn = sqlHelper.ConnectDB();
    SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, conn);
    if (param != null) cmd.Parameters.Add(param);
    cmd.ExecuteNonQuery();
    conn.Close();

//方法三:插入大批量数据时用SqlBulkCopy,单条记录插入效率较慢

             DataTable dt = new DataTable();
             dt.Columns.Add("列名1", typeof(string));
             dt.Columns.Add("列名2", typeof(byte[]));

             DataRow dr = dt.NewRow();
             dr["列名1"] = 值1;
             dr["列名2"] = 值2;
             dt.Rows.Add(dr);
             dr = dt.NewRow();
             dr["列名1"] = 值3;
             dr["列名2"] = 值4;
             dt.Rows.Add(dr);
             SqlBulkCopy bulk = new System.Data.SqlClient.SqlBulkCopy(conn);
             bulk.DestinationTableName=目标表名;
             bulk.BatchSize=dt.Rows.Count;
             bulk.ColumnMappings.Add("列名1",目标列名1);
             bulk.ColumnMappings.Add("列名2",目标列名2);
             bulk.WriteToServer(dt);
             bulk.Close();
             conn.Close();

6.更新数据表某一行的字段值

public static void UpdateFieldValue(string tableName,int rowIndex,Dictionary<string,object> dic_column_value)
{
SqlConnection conn = ConnectDB();
string sql = "select * from " + tableName;
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
SqlCommandBuilder scb = new SqlCommandBuilder(da);
da.UpdateCommand = scb.GetUpdateCommand();
DataSet dataset = new DataSet();
da.Fill(dataset,tableName);

//更新字段值
foreach(KeyValuePair<string,object> kvp in dic_column_value)
{
dataset.Tables[].Rows[rowIndex][kvp.Key] = kvp.Value;
}

da.Update(dataset,tableName);
conn.Close();
}

7.修改文本文件某一行数据的两种方法。

1)File类

//找到setLocation
string[] ary = File.ReadAllLines(path, Encoding.Default);
ary = ary.Select(t => t.Trim().StartsWith("setLocation") ? setLocation : t.Trim()).ToArray();
File.WriteAllLines(path, ary, Encoding.Default);

2)StreamReader类

string text = "";
using (StreamReader reader = new StreamReader(path, Encoding.Default))
{
string line = reader.ReadLine();
while (line != null)
{
//如果这一行以setLocation开始,就替换原来的信息
if (line.StartsWith("setLocation"))
{
line = setLocation;
}
text += line + "\r\n";
line = reader.ReadLine();
}
reader.Close();
reader.Dispose();
}
//写入流,更新数据
using (StreamWriter writer = new StreamWriter(path))
{
writer.Write(text);
writer.Close();
writer.Dispose();
}

8.查询DataTable

DataTable dt_New = sourceTable.Clone();
DataRow[] drs = sourceTable.Select(filter);
foreach (DataRow dr in drs)
{
dt_New.Rows.Add(dr.ItemArray);
}
return dt_New;

9.linq取DataTable某一列数据返回给一个List<int>。

var list =dt.AsEnumerable().Select<DataRow, int>(x => Convert.ToInt32(x["列名"])).ToList<int>();

10.取dictionary<key,double>中value按升序排列的第一个key值。

var minValueKey=(from d in dic orderby d.Value ascending select d.Key).First()

11.利用sqlserver 提供的bcp.exe插入数据。

class bcpHelper
    {
        public static StreamWriter SW_log { get; set; }
        static string bcpExePath = Environment.GetEnvironmentVariable("programfiles")+
            @"\Microsoft SQL Server\100\Tools\Binn\bcp.exe";

        public static void BatchInsertProcess(string dbName,string svName,string sourceFile,string targetTable,
            string errorFile,string outBcpFile)
        {
           //-c则要求要插入的文件编码为ascii编码,-w则为Unicode
           string args = "["+dbName+"]" + ".." +"["+ targetTable+"]" + " in \"" + sourceFile + "\"" +
                    " -S " + svName + " -T -w -t \",\" -e \""+errorFile+"\" -o \""+outBcpFile+"\"";
           shellHelper.executeShellCmd(bcpExePath, args);

            //判断bcp是否成功
           FileInfo fi = new FileInfo(errorFile);
           )
           {
               Console.WriteLine("Error:Fail to process bcp!");
               txtWriteHelper.AppendLog(SW_log, "Error:Fail to process bcp!");
           }
        }
    }

12.Math中的取整方法

Floor:向下取整,只取整数部分;

Round:四舍六入,遇到五则取偶数;

Ceiling:向上取整,只要小数部分大于等于一,均往上加一。

随机推荐

  1. centos7 shell脚本实现随机数

    questions: 1.随机数如何获得 2.如何确定随机值的大小是我们所需要的 answers: 1.目前可以通过获取系统时间的毫秒数来得到,毕竟毫秒数还是变化比较快的 可以看到这个速度还是变化很快 ...

  2. FireMonkey 保存图片到JPG的方法 BMP转JPG

    习惯VCL的做法了,到了FireMonkey里面,好像查不到单独的JPEG单元了,不少朋友就郁闷如何处理JPG了,这么大件事,不可能没有处理方法的,具体就请看代码: uses FMX.Surfaces ...

  3. sql常用单行函数

    学到数据库了,小记一下的喽~~~>>>>常用的单行函数 select * from employees 查询所有 select first_name,lower(first_n ...

  4. Android线程中设置控件

    在Android中经常出现多线程中设置控件的值报错的情况,今天教大家封装一个简单的类避免这样的问题,同样也调用实现也非常的方便. 自定义类: /** * Created by wade on 2016 ...

  5. SSO单点登录Spring-Security & CAS使用手册

    1.1概述 1.1.1单点登录介绍 单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可 ...

  6. ipad pro 文章

    这篇文章是通过iPad Pro发送的.体验一下键盘输入,以及safari下的输入.这个键盘的输入手感好一般,按键行程较短.

  7. Other linker flags

    -ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使 ...

  8. ExecutorService线程池应用

    //线程数量 int threadNum = lists.size(); //创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(t ...

  9. 逻辑回归算法的原理及实现(LR)

    Logistic回归虽然名字叫"回归" ,但却是一种分类学习方法.使用场景大概有两个:第一用来预测,第二寻找因变量的影响因素.逻辑回归(Logistic Regression, L ...

  10. Win7下Doxygen配置与使用

    1.  下载与安装 1.1 下载 Doxygen官方安装程序及其手册下载地址,目前使用版本为1.8.8. 安装程序:http://www.stack.nl/~dimitri/doxygen/downl ...