C# in VS
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:向上取整,只要小数部分大于等于一,均往上加一。
随机推荐
- [LeetCode_3] Longest Substring Without Repeating Characters
LeetCode: 3. Longest Substring Without Repeating Characters class Solution { public: int lengthOfLon ...
- Markdown工具之---Typora
在项目集成阶段中,接口文档是不可避免的,以往的我使用word编辑器编写接口文档,虽然word使用不是很熟练,但是只要在网上下载模板或者自己花时间搞定一个文档格式 基本能一劳永逸.但是还是会有很多问题存 ...
- 写在OpenFire
首先,确保你已经关掉了openfire打开终端 (在应用程序-->实用工具-->)输入以下命令sudo rm -rf /Library/PreferencePanes/Openfire.p ...
- 看守所、戒毒所3D指纹门禁系统解决方案
为响应"科技强警"的战略方针,华本构建了一个完整的.集成的.可靠的.易操作的高安全性门禁系统,应用于看守所.戒毒所.公安局和部队等单位,使管理更现代化.规范化,有效地预防和制止越狱 ...
- Ruff is in the house
Ruff is in my home. 浦东的一家小厂出产的开发板,让我可以用万能的JS开发. 等下试试它的树莓派SDK. 新的时代,旧的东西在被慢慢改进.只要有一颗想动手捣鼓的心,自然会找到合适的工 ...
- python用来压缩目录的脚本
import zipfile,os,sys def zip_dir(dirname, zipfilename): filelist = [] if os.path.isfile(dirname): f ...
- JAVA 重复提交
FormServlet package servlet; import java.io.IOException; import javax.servlet.ServletException; impo ...
- 虚拟现实外包公司—焰火工坊CTO团队外包难把VR真正做起来,讲故事可能将伤害产业链
CTO王明杨,带着他的焰火工坊,正在为自家VR播放器和系统的上线做最后准备.不少投资机构,有传言称包括小米在内巨头都试图染指VR领域,而上月上市的暴风影音正是倚靠VR的概念成功助推了其高股价.对此,王 ...
- MFC编程入门之二十(常用控件:静态文本框)
上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控 ...
- hadoop启动是常见小问题
1.先su进入root账户,然后 service iptables stop //关闭防火墙 start-all.sh //启动 2.启动是会显示,如果出错日志保存路径!!!基本所有问题都要去这些日志 ...