7月9日 星期四 天气还是晴得不得了
今天主攻目标是数据库的备份和还原,写完这个应该两天之内就可以完成整个向导模块拉。
先记录问题:
(1)SQLDMO在.net中无法找到。
解决:The SQLDMO object comes from the SQLDMO.dll that ships with SQL Server 2000. The dll itself is a COM object and you must reference it from your .net project as such. The IDE will create the necessary COM wrappers needed to use the library. NOTE: IF YOU USE THE STATEMENT "using SQLDMO;" IN YOUR APP YOU MAY GET AN ERROR.
上面这段话解释一切拉。所以要先在工程中添加对SQLDMO的引用。SQLDMO stands for SQL Distributed Management Object.
(2) LINQ是怎么弄的?项目使用LINQ来读写数据库。
解决:看《C#高级编程(第6版)》第27章。笔记晚点另外作文补上。
(3) 属性的使用有问题,编译无误,运行堆栈溢出。
解决:属性的使用错误。因为就是简单地在字段后面加一个代码段,里面放一个get代码段,一个set代码段即可。其实不然,看看这个例子吧。太粗心了。
private int _accountNumber;
// AccountNumber只读属性
public int AccountNumber
{
get
return _accountNumber;
}
}
其实这样写才是正确的。
(3) 保存文件怎么写。SaveFileDialogue跟OpenFileDialogue有什么区别?
解决:其实跟打开文件对话框的使用非常类似:
SaveFileDialogue savefileDlg = new SaveFileDialogue();
if (savefileDlg.showDialogue()==DialogueResult.OK)
{
TextBoxFilePath.Text = savefileDlg.FileName;
}
(4)按照上面的方法,设置文件后文件对话框仍然存在。
(5)无法备份,出错信息:
[Microsoft][ODBC SQL Server Driver][SQL Server]无法打开设备'D:/gfs",出现系统错误5(拒绝访问)[Microsoft][ODBC SQL Server Driver][SQL Server]BACKUP DATABASE正在异常终止。
7月10日 星期五 天气晴啊晴啊晴
(今天继续解决昨天的问题。。。。。)
解决:将备份文件名在程序中硬编码写成:@"**.**"即可。
SQLDMO.Backup类对象的fileName属性原来赋值是文件保存对话框的FileName属性,即输入的某个路径,如:D:/gfs。这样写就会报出上面的错误,但是改成解决的样子就没问题了。
但是发现如果写成@"D:/gfs",这样还是会报错,而且关键的是写成@"**.**"的形式虽然是可以过,但是备份文件根本找不到!
解决2:发现原因的所在了。网上说的两种方法,不管是用SQLDMO还是直接写SQL语句,都是直接调用数据库服务器自带的服务。也就是说备份是由数据库来备份,所以数据库写入的路径是根据他自己的服务路径来写的,比如说默认安装路径的SQL Server,备份的路径是C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/Backup。那为什么我找不到呢?因为数据库服务器在远程机器上,所以备份是备份在远程机器上,根本不是写在本地机器上,这样就可以解释上面那个错误了。因为远程机器上的SQL服务器根本没有在本地磁盘写文件的权限。
解决方案:目前计划是自己来写一个备份类,即导出数据库数据并按照自己定制的格式来保存。唯有这样才能满足项目的两个需要:一要保存在本地,二要可定制地导出数据,比如导出某段时间内的数据。
(6)ProgressBar几乎没有进度显示就成功完成备份,跳到下一页了。
解决:原因是SQLDMO.Backup对象中的BackupSink_PercentCompleteEventHandler并没有给出正确的Percent,调试的时候发现Percent一直为0.
解决:根据上面的解决方案,定制数据库导出类的时候,再自行写一个事件就好了。不过原因还是没有找出啊。
(总结一下,今天仍没有完全解决昨日留下的问题。下午有点气馁,还好没有太影响工作,下午换一下脑子去点低技术含量的工作,将n个向导都做好,因为有了模版,很快的。。。)
明天是大周要加班,明日再会吧。