单车男

每天进步一点点,积累下来就不得了...
随笔 - 13, 文章 - 0, 评论 - 27, 阅读 - 44822
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

2013年8月5日

最近在写账套工具,写一些总结和体会。
 
1) 注册DLL,OCX
最简单的方法,直接使用Process.Start(cmd路径)来执行注册,其中cmd为可参考为如下
 
regsvr32 "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqldmo.dll"
@echo off
echo 注册成功,谢谢您的使用!
Pause
 
2)复制文件夹路径
复制文件很简单,但是直接复制文件夹呢,就稍微麻烦些,因为毕竟微软没提供这样的API,所以只能自己写
 
参考了下网上有人提供的源代码,再稍微修改了下,其实思路很简单,就是用递归的方式,一层一层的复制,直到最后一层
 
    private void CopyDirectory(string srcdir, string desdir)
        {
            string folderName = srcdir.Substring(srcdir.LastIndexOf("\\") + 1);
            string desfolderdir = desdir + "\\" + folderName;
            if (desdir.LastIndexOf("\\") == (desdir.Length - 1))
            {
                desfolderdir = desdir + folderName;
            }
            string[] filenames = Directory.GetFileSystemEntries(srcdir);
            foreach (string file in filenames)     // 遍历所有的文件和目录
            {
                if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
                {
                    string currentdir = desfolderdir + "\\" + file.Substring(file.LastIndexOf("\\") + 1);
                    if (!Directory.Exists(currentdir))
                    {
                        Directory.CreateDirectory(currentdir);
                    }
                    CopyDirectory(file, desfolderdir);
                }
                else // 否则直接copy文件
                {
                    string srcfileName = file.Substring(file.LastIndexOf("\\") + 1);
                    srcfileName = desfolderdir + "\\" + srcfileName;
 
                    if (!Directory.Exists(desfolderdir))  //已存在就不创建
                    {
                        Directory.CreateDirectory(desfolderdir);
                    }
                    File.Copy(file, srcfileName, true);  //覆盖
                }
            }
        }
 
3)  数据库备份,还原
方法1:利用SQLDMO方式,缺点是需要注册,SQLSERVER默认安装并不支持这个,注册可参考文件说明:
 
 
代码可参考:
            //备份
            SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
            SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
            try
            {
                oSQLServer.LoginSecure = false;
                oSQLServer.Connect(".", "sa", "a1~");//服务器名、账号、密码
                oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
                oBackup.Database = "b22";
                oBackup.Files = "[" + @"C:\123.bak" + "]";
                oBackup.BackupSetName = "b22";
                oBackup.BackupSetDescription = "数据库备份";
                oBackup.Initialize = true;
                oBackup.SQLBackup(oSQLServer);
             }
            catch
            {
                throw;
            }
            finally
            {
                oSQLServer.DisConnect();
            }
        
            //还原
            SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
            SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
            try
            {
                oSQLServer.LoginSecure = false;
                oSQLServer.Connect(".", "sa", "a1~");
                oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
                oRestore.Database = "b22_bb";
                oRestore.Files = @"D:\temp\123.bak";
                oRestore.RelocateFiles = "fzdrp," +
                        @"[D:\temp\123.mdf]," +
                        "fzdrp_log," +
                        @"[D:\temp\123.ldf],";
                oRestore.FileNumber = 1;
                oRestore.ReplaceDatabase = true;
                oRestore.SQLRestore(oSQLServer);
            }
            catch
            {
                throw;
            }
            finally
            {
                oSQLServer.DisConnect();
            }
优点:比较对象化,方便,缺点非本机备份还原,相对麻烦(我也没研究过非本机的,因客户要求,只是在数据库服务器上操作)
 
方法2:利用SQLSERVER自己的SQL命令,也算比较简单,有一些附加命令可用,以下列出最简单的DEMO
 
--备份
backup database test to disk='d:\temp\b22.bak'
 
--恢复
use master
go
 
ALTER DATABASE B22 SET OFFLINE  --目的是杀掉其他连接,强制脱机
restore database b22 from disk='d:\temp\b22.bak'
 
4) 升级数据库
 
方法一:这个是最折腾人的,我当时利用process来启动osql.exe进程来执行。在网上找了很多资料,大概调用如下:
 
            Process osqlProcess = new Process();
            osqlProcess.StartInfo.FileName = "osql.exe";
            string sqlpath =  System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"updatesql.sql") ;
            osqlProcess.StartInfo.Arguments = String.Format("  -U {0}   -P {1}   -S {2}   -d {3}   -i {4} -b", "sa", "a1~", "LJUN", "b22", sqlpath);
            osqlProcess.StartInfo.UseShellExecute = false;
            osqlProcess.StartInfo.RedirectStandardOutput = true;  //重定向输出
            osqlProcess.StartInfo.CreateNoWindow = true;
 
            osqlProcess.Start();  //执行输出
            //osqlProcess.StandardOutput.ReadToEnd();  //加上后若在小文件执行时,发生错误没有输出值;没有则在大文件执行时却会被停止,加与不加根据实际情况考虑
            osqlProcess.WaitForExit();
            int code = osqlProcess.ExitCode;
            StreamReader sr = osqlProcess.StandardOutput;
 
             //升级失败
            if (code != 0)
            {
                MessageBox.Show("脚本执行失败,关闭后可查看日志了解详情!");
                string strMsg = sr.ReadToEnd();
                string filepath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"err.txt");
                StreamWriter sw = new StreamWriter(filepath);
                sw.Write(strMsg);
                sw.Flush();
                sw.Close();
                sw.Dispose();
                Process.Start(filepath);
            }
            else {
                MessageBox.Show("执行成功!");
            }
            osqlProcess.Close();
            sr.Close();
            sr.Dispose();
 
最扯蛋的就是中间注释成红色的这段,加上后若在小文件执行时,发生错误没有输出值;如不加则在大文件执行时却会被停止,进程处于死锁状态。查了很多资料,才发现这篇文章,给大家分享: http://www.cnblogs.com/angus332770349/archive/2012/06/15/2550247.html ,看来加与不加根据实际情况考虑。
 
方法二: 直接将上面的osql.exe 替换成sqlcmd.exe,因为调用一样,所以其他不变,经测试,并不出现上述的问题,看来问题完美解决,然后又查了一些资料,关于osql.exe,sqlcmd.exe,还有isql.exe,得出结论
 
这3个工具使用了不同的SQL连接部件,sqlcmd用在sql 2005或更高版本,因为性能更好;osql 主要用于sql 7.0和sql 2000;isql主要用于sql 6.5及更早的版本!所以当可以使用sqlcmd时,优先选择这个
 
5) 重启SQL服务
 
方法1: 写入一个cmd文件来重启,用Process.Start来调用,cmd文件命令如下
 
net stop mssqlserver
net start mssqlserver
@echo off
echo 重启服务成功!
Pause
 
方法2: C#代码,直接来对MSSQLSERVER的服务进行入手,先停止,再启用服务
 
            ServiceController sc = new ServiceController("MSSQLSERVER");  //重启A-B服务
            sc.Stop();
            sc.WaitForStatus(ServiceControllerStatus.Stopped);
            sc.Start();
            sc.WaitForStatus(ServiceControllerStatus.Running);
            sc.Close();
            sc.Dispose();
 
6) 禁用IIS服务
 
同样也有如上两种方式,不过第1种我没试成功,win7下好像不行,win2003是可以的!第2种比较好
 
方法1:直接关闭iisadmin服务
 
            ServiceController sc = new ServiceController("iisadmin");
            sc.Stop();
            sc.WaitForStatus(ServiceControllerStatus.Stopped);
 
 
方法2:利用进程启动cmd方式
 
            Process cmdProcess = new Process();
            cmdProcess.StartInfo.FileName = "cmd.exe";    
            cmdProcess.StartInfo.Arguments = "net stop w3svc";
            cmdProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            cmdProcess.Start();
            cmdProcess.WaitForExit();
            cmdProcess.Close();
 
 -------------------------------------------------华丽的分割线---------------------------------------------------------------------------
 
随笔记录,LZ比较懒,大家凑合看看,格式就懒得调了,原创文章,转载请注明.....
 
----------------------------------------------------------------------------------------------------------------------------------------

posted @ 2013-08-05 15:47 单车男 阅读(447) 评论(0) 推荐(0) 编辑

2012年9月17日

摘要: 临时表或表变量我们一般用来充当中间结果集,很多时候都在用,但真正了解他们之间的区别的人还是很少的,网上流传的说法也不甚统一,所以今天我就做一个实验,让我们看看临时表和表变量的区别,以及他们各自的用途。执行以下语句,对测试环境做准备DBCC DROPCLEANBUFFERS --从缓冲池中删除所有清除缓冲区DBCC FREEPROCCACHE --清除计划缓存CHECKPOINT --写入MDF中1) 关于存储表变量在内存中,是否真的不写磁盘,不会造成任何IO开销?use tempdb exec sp_spaceused--database_name database_siz... 阅读全文

posted @ 2012-09-17 17:24 单车男 阅读(1035) 评论(1) 推荐(2) 编辑

2012年8月6日

摘要: 1. 排名函数与PARTITION BYView Code --所有数据SELECT * FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid WHERE scorename = '语文'---------------------------------------------ROW_NUMBER() 的使用 生成列从1开始依次增加-------------------------------------------SELECT ROW_NUMBER() OVER (ORDER BY B.SCOR 阅读全文

posted @ 2012-08-06 23:04 单车男 阅读(734) 评论(3) 推荐(3) 编辑

2012年7月12日

摘要: 最近在改报表分页,遇到一个很棘手的问题,需要将比较正常的数据记录新增加两列。第一列按照goodsid局部分组,然后在分组后的记录中按照audittime升序排序得到序号,从而显示某商品得第几次变迁。第二列是取该商品的最后变迁价格newPrice,然后将该值赋到这个商品的其他行中,例如对于goodsid为1的,最后一个newprice为20,那么对于所有goodsid为1的记录curprice都写为20,从而达到外面控件分布的效果。如下,比较正常的数据记录:需要增加特殊的两列效果为:以前的做法是在C#服务端将正常记录取出来(先按照GoodsId和audittime排序再取的),然后遍历整个数据集 阅读全文

posted @ 2012-07-12 23:56 单车男 阅读(453) 评论(0) 推荐(0) 编辑

2012年7月5日

摘要: 写这篇文章,主要是总结最近学到的一些新知识,这些特性不一定是SQLSERVER最新版才有,大多数是2008新特性,有些甚至是更早。如果有不懂的地方,建议大家去百度谷歌搜搜,本文不做详细阐述,有错误的地方,欢迎大家批评指正。1. TVP, 表变量,临时表,CTE 的区别TVP和临时表都是可以索引的,总是存在tempdb中,会增加系统数据库开销,而表变量和CTE只有在内存溢出时才会被写入tempdb中。对于数据量大,并且反复使用,反复进行查询关联的,建议使用临时表或TVP,数据量小,使用表变量或CTE比较合适2. sql_variant 万能类型可以存放所有数据类型,相当于C#中的object数据 阅读全文

posted @ 2012-07-05 00:23 单车男 阅读(838) 评论(1) 推荐(0) 编辑

2012年6月27日

摘要: 在公司论坛里,看到一篇帖子,叫“高质量编码必会”,是技术研究部老大发的,附件有一个PDF,处于好奇,我下载下来阅读了下,觉得还不错,所以和大家简单分享下我觉得比较有用的要点,有兴趣的同学可以把文件下载下来阅读,内容通俗易懂,很适用。1)工具采用 TeamCity FindDup 查找重复代码点 (我没用过,也没找到相关工具,有用过的人请告知)采用 Dpack 定位函数、类 (我没用过,也没找到相关工具,有用过的人请告知)采用 Everything 查找文件采用 coderush 自动安全的重构另外我推荐一个工具SQL Prompt 5,在 SQLSERVER 里可以很方便的使用,主要是有表字段 阅读全文

posted @ 2012-06-27 22:54 单车男 阅读(842) 评论(5) 推荐(1) 编辑

2012年6月26日

摘要: 最近一直在研究winForm和webForm之间的调用,大家都知道,winForm是CS架构,webForm是BS架构,两种架构是不能直接通信的,那么真的就一点儿办法都没了吗?其实不然。看了网上很多资料,我总结出有两种方式可以实现。1)首先客户端需要用注册表写入协议,通过协议去找已经安装在客户端的winForm的exe文件,这时可以给窗体传入参数,例如 “helloworld://你个猪头”, helloworld是协议,后面”你个猪头“是传入的字符串。当然winForm的main方法写法也有不同,需要得到参数(也可以不要参数,如果不需传参,直接调用) /// <summary>. 阅读全文

posted @ 2012-06-26 00:10 单车男 阅读(3029) 评论(1) 推荐(2) 编辑

2012年6月20日

摘要: 今天技术研究部(TRD)的一位DBA同事对我们系统提了一个调优BUG,用到了for xml path语句,我开始看了半天都不知道什么意思,后来看了下 http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html 后才知道他的用法,这里先附上调优的原文,大家先看看:-------------------------------------------------------------------------------程序调用中:在sql中用类似下面的语句替换: Select BillCode, isnull(list, 阅读全文

posted @ 2012-06-20 23:32 单车男 阅读(748) 评论(0) 推荐(0) 编辑

2012年6月17日

摘要: 先说说题外话,前段时间近一个月,我一直在做单据导入功能,其中就涉及到Excel操作,接触Excel后发现他的api说明并不多,好在网上有很多朋友贴出了一些代码,我在不断的挫折中吸取了很多教训,现共享出来,给大家参考。1. 最好在客户端使用,不要在B/S服务端使用,因为会受到IIS权限和占用内存影响,多人并发操作必然完蛋2. 需要引入两个DLL,Microsoft.Office.Interop.Excel.dll和office.dll,在加上项目的时候,会报错“类型“Microsoft.Office.Interop.Excel.ApplicationClass” 未定义构造函数无法嵌入互操作类型 阅读全文

posted @ 2012-06-17 22:18 单车男 阅读(34542) 评论(9) 推荐(11) 编辑

2012年6月10日

摘要: 本周技术研究部(TRD)的一名DBA 对我们编写SQL时的一些问题,进行了汇报讲演,以下是来自它的脚本,我在它讲演的基础上写出了自己想表述的,以便于大家相互交流学习。/*--注意:准备数据(可略过,非常耗时)CREATE TABLE CHECK1_T1( ID INT, C1 CHAR(8000))CREATE TABLE CHECK1_T2( ID INT, C1 CHAR(8000))DECLARE @I INTSET @I=1WHILE @I<=10000 BEGIN INSERT INTO CHECK1_T1 SELECT @I,'C1' INSER... 阅读全文

posted @ 2012-06-10 23:58 单车男 阅读(812) 评论(2) 推荐(2) 编辑

点击右上角即可分享
微信分享提示