关于VB.NET项目打包后数据库无法写入数据的解决方案

         啊哈,辛辛苦苦的,连跑带滚的终于把自己的软件做完了,不过,一直有个疑惑在心中,每次将软件打包成安装包,再进行安装后,打开自己的应用程序,总是会提示数据库写入数据失败,也就是提示“操作必须使用一个可用的更新”等这样的错误,第一次看到时候,心里面直接凉了半截,心想,坏事了,这次做的程序竟然在这个阶段不能使用了,当时在编写环境下运行,可没有出现这种情况啊……

       喝了杯水,让自己冷静了一下,回想着自己做数据库,自己写代码过程中,没有错误,也没有警告,应该不会出错啊,为了安全,数据库设置了密码……等等!好像我不设置数据库密码的时候,打包安装并没有出现过这个问题啊,难道是设置密码的问题?但是数据库也不能不设置密码啊,为了数据安全,是吧。

       苦思冥想了很长时间,我就有点不耐烦了,不过,一个偶然的机会,让我到数据库文件的安全性上看到了一些破绽。

       我们单击下面的,打开文件位置按钮。

关于VB.NET项目打包后数据库无法写入数据的解决方案_第1张图片

        之后我们找到数据库文件,右键单击属性,貌似只读和隐藏属性都没有被选中,说明不是因为这个引起的,我们再看看还有什么。

关于VB.NET项目打包后数据库无法写入数据的解决方案_第2张图片

         好像,还有个安全性的选项。恩恩,单击编辑。

   关于VB.NET项目打包后数据库无法写入数据的解决方案_第3张图片

         之后我们勾选了完全控制,下面的复选框基本就自动勾选了,入下面的图。

    关于VB.NET项目打包后数据库无法写入数据的解决方案_第4张图片

        单击确定,重新运行了软件,发现了很神奇的一幕,也就是,可以写入数据了!

        欣喜万分啊~看来自己的工作没有白做,但是这样对于用户来说,就有点麻烦了,而且数据库文件一般都是隐藏的属性,怎么办呢?

        查阅了一些资料,我终于明白的其中的秘密,嘘~小声点,我就给你说!

        我发现,数据库文件在软件安装的目录下,在windows7及其以上系统中,和应用程序一个文件夹下的数据库文件会自动的提高安全属性,所以我们必须这样设置,来解决应用程序对数据库文件的写入和删除等非只读操作。

        那么也就是说,只要我们把数据库文件不和主程序文件放到一起,就可以了,那么,这就涉及到修改数据库连接字符串了,使用相对路径。

        原来的代码,是这样的~

Public Class DBOperation
    '定义一个数据库操作类函数,其传入的参数是查询字符串,返回值的类型是内存中的数据表DataTable
    Shared Function DBOperate(ByVal SQLString As String) As DataTable
        Dim CONN As String
        CONN = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=true;Data Source=SEB.mdb;Jet OLEDB:Database Password=***;"
        Dim oleconn As New OleDb.OleDbConnection(CONN)
        Dim cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand(SQLString, oleconn)
        cmd.CommandType = CommandType.Text
        Dim sTokens() As String
End Function
        我们可以看到,在连接字符串中,直接就写明了数据来源,但是这样就要求数据库文件必须和主程序文件在同一个文件夹下,我将代码段改成下面的后,这个问题就解决了:

Public Class DBOperation
    '定义一个数据库操作类函数,其传入的参数是查询字符串,返回值的类型是内存中的数据表DataTable
    Shared Function DBOperate(ByVal SQLString As String) As DataTable
        Dim CONN As String
        CONN = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=true;Data Source=|DataDirectory|\Sources\SEB.mdb;Jet OLEDB:Database Password=***;"
        Dim oleconn As New OleDb.OleDbConnection(CONN)
        Dim cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand(SQLString, oleconn)
        cmd.CommandType = CommandType.Text
        Dim sTokens() As String
End Function
       我们注意到,这段代码Data Source=|DataDirectory|\Sources\SEB.mdb,就说明,我们把数据库文件放置在程序根目录下的Sources文件夹下,这样就解决了这个问题。

你可能感兴趣的:(学术心得)