CSV导入导出工具

介绍 本文介绍并且实现了在平面文件CSV和SQL server之间的导入导出功能。使用VS2005写的。使用了.net 2.0 本文基于前一篇文章:从CSV导入数据并存储到数据库,本文包含了新功能,比如,导出功能,在数据库创建表,批量拷贝。接下来的例子中有很多注释。 导入 通过ODBC驱动连接到一个CSV文件,然后把文件读到一张表了(基于前面提到的那篇文章) 使用不同的编码和不同的行分隔符(基于前文) 加载CSV文件到DataSet(基于前文) 如何显示对CSV文件的预览(基于前文) 通过SqlBulkCopy的对象向SQL server转移数据,原始数据是DataSet实例 使用结构表,基于CSV文件,创建一个新表 使用事件来处理批量拷贝的进程 导出 浏览SQL 数据库中的用户表 使用不同的编码和分隔符 使用SqlDataReader读取数据,使用StreamWriter转移数据到平面文件 使用 下载工程 新建一个数据库,或者使用一个存在的数据库 修改软件中的数据库连接字符串,在prop.cs文件中 public static string sqlConnString = "server=(local); database=Test_CSV_impex;Trusted_Connection=True"; 运行工程 一些代码段 加载CSV到DataSet中 /* *加载CSV到DataSet. * * 如果numberOfRows parameter 是 -1, 就加载所有行, 否则就加载指定数目的行 */ public DataSet LoadCSV(int numberOfRows) { DataSet ds = new DataSet(); try { // 创建并打开ODBC连接 string strConnString = "Driver={Microsoft Text Driver (*.txt; *.csv)}; Dbq=" + this.dirCSV.Trim() + "; Extensions=asc,csv,tab,txt;Persist Security Info=False"; string sql_select; OdbcConnection conn; conn = new OdbcConnection(strConnString.Trim()); conn.Open(); //创建SQL语句 if (numberOfRows == -1) { sql_select = "select * from [" + this.FileNevCSV.Trim() + "]"; } else { sql_select = "select top " + numberOfRows + " * from [" + this.FileNevCSV.Trim() + "]"; } //创建数据适配器 OdbcDataAdapter obj_oledb_da = new OdbcDataAdapter(sql_select, conn); //用CSV的数据填充DataSet obj_oledb_da.Fill(ds, "csv"); //关闭连接 conn.Close(); } catch (Exception e) //异常处理 { MessageBox.Show(e.Message, "Error - LoadCSV", MessageBoxButtons.OK,MessageBoxIcon.Error); } return ds; } 通过SqlBulkCopy从ODBC连接中转移数据到数据库 ...

2012-09-30 · 4 min · bystander

ListView布局管理器

介绍 使用ListViewLayoutManager 可以控制ListView/GridView列的布局 固定列宽:有着固定列宽的列 范围列宽:有着最小最大宽度的列 比例列宽:成比例的列宽 范围列宽可以限制列的宽度,也包括填充列的剩余可视区域。 据我们了解的Html中的表格和Grid空间。比例列以一个百分比来定义列宽,以下几个因素共同确定了比例列的宽度。 垂直ListView滚动条的可视与否 ListView控件宽度的改变 非比例列宽度的改变 本程序支持通过XAML或是后台代码来控制ListView。如果通过XAML来控制。则允许ListViewLayoutManager 被附加到一个存在的ListView控件上。 ConverterGridColumn 类通过接口IValueConverter 提供了对象绑定。使用ImageGridViewColumn 类则允许通过DataTemplate(数据模板)将列显示成图片等。 在 User Setting Applied中,我展示了如何固定ListViewlieder顺序和大小 XAML中ListView/GridView布局 固定列 下面的例子展示了通过XAML使用固定列宽控制列 <ListView Name="MyListView" ctrl:ListViewLayoutManager.Enabled="true"> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding Path=Name}" ctrl:FixedColumn.Width="100" Header="Name" /> <GridViewColumn DisplayMemberBinding="{Binding Path=City}" ctrl:FixedColumn.Width="300" Header="City" /> </GridView> </ListView.View> </ListView> 设置附加到ListView控件上的ListViewLayoutManager 的Enabled属性为True。然后FixedColumn.Width 就会阻止鼠标拖动改变列的宽度。 比例列 下面的例子展示了使用XAML通过比例来控制列 对比Grid控件的RowDefinition.Width 属性,ProportionalColumn.Width会计算百分比。简单来说,就是上面的例子中Name列会占到总宽度的25%,而City列占到75%。 与固定列相似。鼠标将不能改变列的宽度。 范围列 下面的例子展示了使用XAML通过最小/最小宽度来控制列 第一个范围列的IsFillColumn 属性被设置为True,因此将会自动改变大小来填满剩余的空间,而如果ListView包含一个比例列的话,范围列将不会填充 通过鼠标可以拖动范围列的宽度。鼠标指针会有一些提示。。 组合使用 在真实的世界里。组合使用很普遍。他们的顺序可以多种多样。 使用后台代码控制ListView/GridView布局 ListView listView = new ListView(); new ListViewLayoutManager( listView ); // attach the layout manager GridView gridView = new GridView(); gridView.Columns.Add( FixedColumn.ApplyWidth( new MyGridViewColumn( "State" ), 25 ) ); gridView.Columns.Add( RangeColumn.ApplyWidth( new MyGridViewColumn( "Name" ), 100, 150, 200 ) ); // 100...200 gridView.Columns.Add( ProportionalColumn.ApplyWidth( new MyGridViewColumn( "City" ), 1 ) ); // 33% gridView.Columns.Add( ProportionalColumn.ApplyWidth( new MyGridViewColumn( "Country" ), 2 ) ); // 66% listView.View = gridView; 定制列的效果 类ConverterGridColumn 作为一个基类,用来绑定列到独立的对象。 ...

2012-09-29 · 3 min · bystander

C#编写youtube下载器

介绍 本文将会暂时如何仅仅使用C#来下载youtub视频,代码简单也容易理解,每个人都可以把它整合到自己的工程项目里。 我没有使用任何第三方的库来完成这段代码,你所要做的仅仅是把两个.cs文件整合进你的项目里。 使用代码 这个工程里有两个主要的类 YouTubeVideoQuality Class(youtube视频质量类) public class YouTubeVideoQuality { /// <summary> /// Gets or Sets 文件名 /// </summary> public string Videotitle: { get; set; } /// <summary> /// Gets or Sets 文件扩展 /// </summary> public string Extention { get; set; } /// <summary> /// Gets or Sets 文件地址 /// </summary> public string DownloadUrl { get; set; } /// <summary> /// Gets or Sets 视频地址 /// </summary> public string VideoUrl { get; set; } /// <summary> /// Gets or Sets 文件大小 /// </summary> public Size Dimension { get; set; } public override string ToString() { return Extention + " File " + Dimension.Width + "x" + Dimension.Height; } public void SetQuality(string Extention, Size Dimension) { this.Extention = Extention; this.Dimension = Dimension; } } YouTubeDownloader Class(youtube下载类) public class YouTubeDownloader { public static List<YouTubeVideoQuality> GetYouTubeVideoUrls(params string[] VideoUrls) { List<YouTubeVideoQuality> urls = new List<YouTubeVideoQuality>(); foreach (var VideoUrl in VideoUrls) { string html = Helper.DownloadWebPage(VideoUrl); string title: = GetTitle(html); foreach (var videoLink in ExtractUrls(html)) { YouTubeVideoQuality q = new YouTubeVideoQuality(); q.VideoUrl = VideoUrl; q.Videotitle: = title; q.DownloadUrl = videoLink + "&title=" + title; if (getQuality(q)) urls.Add(q); } } return urls; } private static string GetTitle(string RssDoc) { string str14 = Helper.GetTxtBtwn(RssDoc, "'VIDEO_TITLE': '", "'", 0); if (str14 == "") str14 = Helper.GetTxtBtwn(RssDoc, "\"title\" content=\"", "\"", 0); if (str14 == "") str14 = Helper.GetTxtBtwn(RssDoc, "&title=", "&", 0); str14 = str14.Replace(@"\", "").Replace("'", "'").Replace( "\"", """).Replace("<", "<").Replace( ">", ">").Replace("+", " "); return str14; } private static List<string> ExtractUrls(string html) { html = Uri.UnescapeDataString(Regex.Match(html, "url_encoded_fmt_stream_map=(.+?)&", RegexOptions.Singleline).Groups[1].ToString()); MatchCollection matchs = Regex.Matches(html, "url=(.+?)&quality=(.+?)&fallback_host=(.+?)&type=(.+?)&itag=(.+?),", RegexOptions.Singleline); bool firstTry = matchs.Count > 0; if (!firstTry) matchs = Regex.Matches(html, "itag=(.+?)&url=(.+?)&type=(.+?)&fallback_host=(.+?)&sig=(.+?)&quality=(.+?),{0,1}", RegexOptions.Singleline); List<string> urls = new List<string>(); foreach (Match match in matchs) { if (firstTry) urls.Add(Uri.UnescapeDataString(match.Groups[1] + "")); else urls.Add(Uri.UnescapeDataString(match.Groups[2] + "") + "&signature=" + match.Groups[5]); } return urls; } private static bool getQuality(YouTubeVideoQuality q) { if (q.DownloadUrl.Contains("itag=5")) q.SetQuality("flv", new Size(320, 240)); else if (q.DownloadUrl.Contains("itag=34")) q.SetQuality("flv", new Size(400, 226)); else if (q.DownloadUrl.Contains("itag=6")) q.SetQuality("flv", new Size(480, 360)); else if (q.DownloadUrl.Contains("itag=35")) q.SetQuality("flv", new Size(640, 380)); else if (q.DownloadUrl.Contains("itag=18")) q.SetQuality("mp4", new Size(480, 360)); else if (q.DownloadUrl.Contains("itag=22")) q.SetQuality("mp4", new Size(1280, 720)); else if (q.DownloadUrl.Contains("itag=37")) q.SetQuality("mp4", new Size(1920, 1280)); else if (q.DownloadUrl.Contains("itag=38")) q.SetQuality("mp4", new Size(4096, 72304)); else return false; return true; } } 有趣的地方 使用这个代码,你可以根据你的网速来选择不同品质的视频来下载 ...

2012-09-25 · 2 min · bystander

C#删除文件和文件夹到回收站

如果使用C#代码来删除文件或是文件夹。会将文件和文件夹直接删除,而不是删除到回收站。可以调用Microsoft.VisualBasic.dll提供的方法。 首先对项目添加名为Microsoft.VisualBasic.dll的引用,然后添加命名空间 using Microsoft.VisualBasic.FileIO; 最后示例代码如下: using System; using Microsoft.VisualBasic.FileIO; namespace leaver { class Program { static void Main(string[] args) { Console.WriteLine("删除文件到回收站"); string filepath = "leaver.txt"; FileSystem.DeleteFile(filepath, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); Console.WriteLine("删除文件完成"); Console.WriteLine("删除文件夹到回收站"); string dirpath = "leaver"; FileSystem.DeleteDirectory(dirpath, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); Console.WriteLine("删除文件夹完成"); } } } 很简单。。就不多说了。。

2012-09-24 · 1 min · bystander

使用Microsoft Web Deploy技术自动部署

 在前段时间使用WCF的时候。部署到服务器上一直不得要领。出现各种问题。最终搞定。原文图很多,我给个摘要,大家还是原文看。因为原文写于2010年。自动部署工具已经更新至第3版。所以有些按钮得好好找找。不过相信对大家都不是难事。 本篇文章将提供一个循序渐进的教程,教你如何在一台Web服务期上安装和启用Web Deploy。接着我们演示如何使用Visual Studio通过Web Deploy直接(将文件)发布到服务器上,以及如何使用Visual Studio创建自动部署你的应用程序的安装包。 Web Deploy—为什么你会喜欢它 部署一个Web应用程序或站点包含好几个步骤。您通常需要: 1. 拷贝文件和文件夹; 2. 提供数据库结构,或许还要生成一些数据库数据; 3. 在文件和文件夹上设置相应的读写和安全访问控制列表; 4. 安装和配置SSL认证; 5. 部署其它杂七杂八的依赖项(事件日志,GAC库,COM对象等等)。 手工执行上面的步骤又累又慢又危险(因为手工部署总是容易出错)。使用自动化流程,可以让你在一台服务器上快速维护和部署应用程序,减少出错的几率,并极大加快你在应用程序上的改动放到作业服务器上的周期。 去原文看看吧。使用Microsoft Web Deploy技术自动部署

2012-09-04 · 1 min · bystander

超时时间已到,但是尚未从池中获取连接

 前段时间数据库的时候,出现这个问题。一般是读到20多万条的时候。会出现这个问题。 找了一下。主要是这两个问题: 一、看所有open的连接是否都close了。 二、如果访问量很大,加上Max Pool Size=512这一句,当然这是要以损失系统性能为代价的! 我查了一下。数据库连接所有的open都关闭了。 max pool size也确实加上了。但是。问题依旧。。 哦,还有的说在数据库连接字串中添加Connect Timeout=500,也就是设置连接超时更长一些。问题依旧。。 后来看到一篇文章中说: DataReader是独占连接 的,每个DataReader都要占用一个连接。当然这个情况是偶尔出现的,所以会很长时间出现一次,因为只有同时有超过连接池最大连接数量的并发操作才 会发生。而且你加大并发数量只能暂时缓解问题。 文中建议用使用dataset来读取。然后我就把读取数据中使用DataReader的地方全部用DataAdapter和DataSet来获取数据库数据,因为DataSet非独占。会将数据保存在内存中,一次连接后释放,问题解决。 记录一下。

2012-09-03 · 1 min · bystander

面试体验:Google 篇

 尝试在自己的博客上搜索点东西,结果发现 4 年多以前还在博客上写过一系列的 recruiting events,把大四时候参加过的各种笔试面试都记录下来了。我从去年准备离开百度开始,到现在总过面试过 4 家公司:Google、Microsoft、Yahoo、Facebook,原本去年也想把面试经验写一写的,结果一拖就拖到现在。我不想写面试经验,因为我个人不喜欢漏题和背题的做法。我自己作为面试官,知道要设计出来一道好用的题目有多难,所以我希望面试者都是如实表现自己解题能力的。我更喜欢写面试体验,就是在整个面试过程中一家公司给人的印象是怎样的,HR 和面试官是否专业,能否让人信服这是一家值得长期工作的公司。 我想写的第一家公司是 Google,因为它是我在想要离开百度时第一家联系到我的公司。2010 年 12 月底的某一天早上,我突然感觉到我应该离开百度,因为如果这个时候已经没有勇气离开这家公司了,很可能就不会再想要离开了。当天中午在百度大厦西餐厅吃午饭,接到一个 Google 上海 HR 的电话,问我有没有兴趣去面试,我想既然你打电话来的时机那么好,我就答应你去面试吧。(在那一天之前,我对猎头的标准回复是「有美国或者香港的职位吗?」)她问我将来希望在北京还是上海工作,当时我对北京的厌恶程度还没有现在那么高,同时觉得搬家到上海又比较麻烦,于是就说在北京,接着我就变成跟北京 HR 沟通了。 Google 的 HR 会负责做两件简单得不需要面试官做的事情,这能够很好的提高招聘流程的效率。第一件是确认你能够适应工作环境中的英语,为此 HR 要我用英语跟她对话两三分钟,主要就是让我说说工作经验和其中的亮点。习惯在私企工作的人不要以为外企对英语的要求很高,其实大多数长期在中国工作的人说话或者发邮件都会很 Chinglish 啦,所以关键是要敢于用英语进行沟通。 然后 HR 发了一个 Codility 的地址给我,让我有空抽时间去做题。一个小时 3 道难度相当于 OI 基础题的题目,平均 20 分钟一道。最简单的题目一看就知道是 O(n) 能解决的,最复杂的题目看上去是 O(n^2) 但想一下就能优化为 O(n log n)。对于有算法训练背景的人来说,这样的题目会让人感觉到很有把握。对于没有经受过算法训练的人来说,掉进陷阱里是很容易的。很可能没有把 O(n^2) 优化为 O(n log n),结果超时;可能没仔细看题目说明的数值取值范围,某些变量选错了数值类型,结果溢出。考虑到 Google 重视算法的程度,再加上 Google 中国面试的额外难度,算法训练还是很必要的。 在我通过 Codility 测试后,HR 问我了对题目难度的反馈,然后约了一轮电话面试,并且告知面试主要围绕算法、数据结构、系统设计、编码来进行。Google 面试的格式都很固定,45 分钟内期望你能做出 3 道题来。这 3 道题最起码要能把人人都能想出来的「笨办法」用代码写出来,否则会让面试官感到不满意。如果有些题目能够比较快地做出来,面试官就会让你优化。就算你第一次给出的答案已经是业界已知最优解,面试官都还是会让你优化,因为谁也不知道有没有人能在面试过程中突然爆发,想出一些过去没人想到过的解法。如果面试官心中已有优化的方案,在你想不出优化方案时他可能会给你提供一些提示。 一轮电话面试后,HR 就开始约到 Google 办公室的面试了。第一次约了下午 3 轮面试,还是那个很固定的格式:每轮面试 45 分钟,两轮间隔 15 分钟。整个面试流程让人感觉到很人性化:在 Google 签到后,HR 会先带你去 kitchen 拿点吃的喝的,然后把你带到面试所用的会议室。多轮面试的话,HR 中间还会来问一下你要不要去洗手间,或者多拿两瓶水。面试完毕后 HR 会来问你感觉如何,同时也会让你知道面试官的初步反馈是否跟你的感觉一致。我在 3 轮面试中有一轮感觉不太好,因为面试官只给了 2 道题,并且我最终都没办法解出来,HR 也确认了就是这一轮的反馈不好。 此外,Google 的招聘流程还让人感觉到很有效率。作为面试官,我也知道自己写面试反馈有多喜欢拖延,而且公司填写面试反馈的系统越不人性化我就越想要拖延,然而公司内部系统做得人性化的又实在罕见。Google 的面试基本上隔天就有结果,然后 HR 就会约下一轮的面试。因为我在百度的时候每周哪个时间没有会议是很确定的,所以我总是选择下周同一个时间段来面试。在经过总共 4 轮面试后,HR 说因为前面有一轮的面试官反馈不好,所以希望再加一轮面试。因为前面反馈不好的面试官比较 senior,所以这次找了一位同样 senior 的面试官来面试,于是我又去了一次 Google 办公室。 完成 5 轮面试后,HR 把材料提交给 Google 的北京招聘委员会,结果没有通过。HR 说,因为 Google 都是按照后端工程师的标准来招聘,看重算法和数据结构,前端工程师要通过不容易。因为 Google 没有专门的前端工程师,只有一个软件工程师职位,所以所有人还是必须按照一个标准来衡量。她问我如果找到专门需要前端工程师的团队,并且需要额外再面试的话,我是否感兴趣。当时 Google 是我的第一选择,我当然说感兴趣啦。 后来 HR 跟我说,她帮忙问过 Google Maps,可惜对方说不要专才只要通才。又过了几个星期,HR 发现 IME 需要专门做前端的人,于是帮我再约了一轮面试。这轮面试是在 Google 办公室做的,但实际上是视频会议,因为面试官在美国。(不确定面试官是在美国出差,还是美籍华人。)面试过程跟电话面试类似,用 Google Docs 写代码,比电话面试要好的是说话时能够见到人。 这一轮面试结束后,我的材料再次进入 Google 的北京招聘委员会。HR 说这次专门找了对前端有经验的人来审阅我的材料,结果顺利通过了。接着 HR 问我要了一大堆的补充材料,包括高考成绩和 GPA(连同成绩单),还包括当前薪酬和竞争对手的 offer(我当时有 Yahoo 的 offer),甚至包括过去的获奖和晋升经历。所有这些材料都会发往 Google 美国总部审阅,具体流程 HR 没有细说,但看 Don Dodge 的文章可以了解一些。最后我被 Google 美国总部给拒绝了,然后 HR 还是一如既往地及时沟通,并且安慰了我几句。 ...

2012-08-11 · 1 min · bystander

C#调用Matlab引擎

 最近在使用matlab的时候。求多元函数取得最小值的时候。变量的值。于是就用到了sym符号。结果在C#中调用时总是出错。后来Google了N久发现是符号工具箱是无法编译的。。后来找到了替代方法。就是调用matlab 引擎。当然要稍微麻烦一点。因为调用引擎这种方法参数传递比较麻烦。我只想到了通过C#把需要计算的值保存到文本中。然后matlab中load进来。计算完成后 save出去。。 调用matlab引擎类似于在C#中新开了一个进程。然后执行一些命令。之前需要引用Matlab Application Type Library。这是个com组件 然后在程序里使用 using语句 using MLApp; 然后就可以正常使用了。使用我试过的有两种方法 MLApp.MLAppClass matlab = new MLApp.MLAppClass(); matlab.Visible = 1; string command="figure(1)"; matlab.Execute(command); matlab.Quit(); 很简单。Visible设置可见性。。command表示要执行的命令。 另一种是 MLApp.DIMLApp matlab = null; Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Application"); matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.DIMLApp; matlab.Visible = 1; string command="figure(2)"; matlab.Execute(command); matlab.Quit(); 不知什么原因,第一种方法我没有调用成功。第二种调用成功。欢迎讨论。

2012-08-09 · 1 min · bystander

WPF实现控件拖动效果

首先很简单,当然是去添加两个控件了,这里我添加了两个控件,都是label,然后我想实现的是将label1拖动到label2上的时候,label1的内容会被复制到label2上。 <Label Content="TestDrop" Height ="28" HorizontalAlignment="Left" Margin="70,35,0,0" Name ="label1" VerticalAlignment="Top" MouseDown="label1_MouseDown" /> <Label Content ="ToHere" Height="28" HorizontalAlignment="Left" Margin ="342,107,0,0" Name="label2" VerticalAlignment="Top" AllowDrop ="True" Drop="tagert_drop" /> 需要注意的代码是label1中的MouseDown事件。和label2中的AllowDrop =“True” Drop=“tagert_drop” 然后对应的处理事件 private void label1_MouseDown(object sender, MouseButtonEventArgs e) { Label lbl = (Label )sender; DragDrop.DoDragDrop(lbl, lbl.Content, DragDropEffects .Copy); } private void tagert_drop(object sender, DragEventArgs e) { (( Label)sender).Content = e.Data.GetData(DataFormats.Text); } 其他的效果可以仿照这个来做。比如拖动以后的效果可以DragDropEffects来设置。。

2012-07-27 · 1 min · bystander

DevExpress DXperience Universal 12.1.5 破解补丁

 因为要用到wpf开发软件,而作为一个审美能力和制作美的能力完全不匹配的人。。需要有一个基本的主题框架来作为基础进行开发。。于是我找了找。。刚开始找的是http://www.telerik.com/这个商业库,不过这个用的不太顺手,于是还是试试DevExpress,,果断很不错,找到了破解补丁。 给一个官方的Demo示例图: 安装文件:DXperience-12.1.5安装包 帮助文档:DXperience 12.1.5 Universal 帮助文档: 破解补丁:DevExpress.Registration.Setup.v12.1.5.E3.msi

2012-07-21 · 1 min · bystander