我做了个WINFORM程序,里面有个DataGridView,可以获取SQL数据库的数据,并显示出来。现在想做个数据库备份功能,就是对数据库文件MDF和LDF两个文件进行拷贝操作,但只要WINFORM程序一开始运行,对这个文件的读取   FileStream fs = File.OpenRead(文件路径);这句话就会出IO异常:正由另一进程使用,因此该进程无法访问此文件。但只要关了WINFORM,就可以对他目录下的数据库文件随便复制粘贴了。麻烦大家帮忙想想办法,在不关闭WINFORM前提下对那两个数据库文件进行复制操作。

解决方案 »

  1.   

    我知道在占用,但即使我写在Program.cs里,
    static void Main()
            {
                FileCopy.CopyDir();
                bool bCreatedNew;
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Mutex m = new Mutex(false, "Fly", out bCreatedNew);
                if (bCreatedNew)
                {
                    Application.Run(new MainForm());
                }
            }FileCopy.CopyDir()这个方法就是复制数据库文件到另一个地方,也会出现同样错误,试了好多方法,都不管用。
      

  2.   

    对于SQl的库,没有分离的数据库文件是不能执行“复制”的操作的吧?
    要想进行“复制”操作  应该先分离数据库吧?
    lz你在使用者数据库的同时还想进行这种操作,应该是不行的吧
    你打开着一个Word文件,对这个文件也是不能进行这个操作的吧
      

  3.   

    难道就没有办法了吗? 我在程序的哪个地方锁定这个程序被占用了呢?  能不能先停止下占用呢??我就想不明白了,为啥在Main()里面最上面写的这个方法,也会出现同样的错误,根本还没有被使用~希望明白的朋友帮忙解释一下:)啊~受不了!KMN!
      

  4.   

    只要关了WINFORM,就可以对他目录下的数据库文件随便复制粘贴了。
    这个不能吧,还没分离不会让你随便拷的。可以用sql语句备份数据库啊   生成bak文件
      

  5.   

    执行sql语句
    BACKUP DATABASE 数据库名称 TO DISK = 'c:\数据库备份.bak'
      

  6.   

    我倒是也想引用SQLDMO.DLL来进行数据库备份,但目标电脑不一定有SQLDMO,而且不一定进行了REGSRV32注册,如果直接复制数据库文件,会方便的多,毕竟数据库不大,最多时才20万条数据。如果用存储过程,也会有变故,而且我用的是LINQ TO SQL,没必要这么麻烦。高手们,麻烦想想办法吧,大过年的,辛苦了。
      

  7.   

    LINQ TO SQL也是可以执行sql语句的.
      

  8.   

    数据库没有分离无法复制  哪怕你直接ctrl+C 然后粘贴都不行
      

  9.   

    我发现,如果KILL掉servr.exe进程,就可以复制粘贴了。但系统有两个servr.exe进程,杀掉用户那个才可以,杀掉系统那个或两个都杀掉,就不行了。如果只kill掉用户进程servr.exe??
      

  10.   

    你个笨蛋 ,思路太死了  去建立个数据库  再把你的表复制过去
    没有表就建立个   简单的sql语句全部搞定  干嘛搞这么复杂?解决不了绕过去
      

  11.   

    对了 你这个问题可能是由于adatper造成的,他要把数据库的数据读取到dataset中,还要把dataset中修改后的数据再返回到数据库,所以这个时候复制时不容许的,但是把update功能去掉我觉得能行 你也可以试试
      

  12.   

    我不知道如何表达我的想法了。你结束进程当然能复制了,结束进程。sqlserver的服务也给停止了!!!
    这种情况是绝对不允许的。
      

  13.   

    允许复制时暂停服务的话就先停掉SQL服务,然后复制黏贴ldf和mdf,再重启动服务。
    否则还是Backup-Restore大法吧。我觉得这样设计是合理的,因为复制文件总会有时间差,这个时间差内要如何保证数据信息和日志信息是绝对一致的呢?貌似也只能停服务了。
      

  14.   

    呵呵 ls给的思路
    在你的程序中 通过第三方库,直接由SQL语句分离你的目标数据库,完后复制到 你所谓的备份处
    然后再执行Sql语句 把你的库在给附加上变态的需要往往要用变态的方法来搞
      

  15.   

    不需要断开链接的方法:去建立个数据库 再把你的表复制过去或者用ado.net 断开链接也不会影响前台使用.
    意思是把数据复制到内存.断开链接.备份.重新链接.
      

  16.   

    你的那种想法我实现过了,做了一个类似 Sql Server管理器的东西,也能列出数据库对象。在这里面进行各种操作,包括你说的那种备份物理文件。其实在备份开始还是用代码将数据库文件进行了分离,备份完后再用代码附加上去。这是肯定的,也就是意味着没有人在使用这个库了,才由你备份。否则不可能备份物理文件的。