【问题标题】:The process cannot access the file because it is being used by another process [closed]该进程无法访问该文件,因为它正在被另一个进程使用[关闭]
【发布时间】:2015-12-14 22:57:42
【问题描述】:

我使用此代码但无法关闭连接

cnnstr = " Data Source=.\SQLEXPRESS;AttachDbFilename=" & CurDir() & "\datastore.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(cnnstr())
Dim com As New SqlCommand("insert into tblbackuphistory values('" & dateshamsi & "','" & saat & "','" & mas & "',N'" & user & "')", con)

If con.State = ConnectionState.Closed Then 
    con.Open() 
End If

com.ExecuteNonQuery()
com.Cancel()
com.Connection.Close()
con.Close()
com.Connection.Dispose() 
con.Dispose()

【问题讨论】:

    标签: sql .net vb.net


    【解决方案1】:

    如果Open()ExecuteNonQuery() 抛出异常,那么后面的.Close() 调用将永远不会执行。这就是为什么你应该总是使用Try/Finally 块来处理这样的事情,并且可以使用Using 块来缩短它。

    虽然我在这里,但这段代码很容易受到 sql 注入攻击。对于仅作为已安装程序的本地数据存储存在的数据库(没有人关心用户是否想在他们拥有的数据库中注入数据),这可能没问题,但是 sql 字符串的字符串连接仍然是一个坏习惯。如果最终用户名中带有撇号会怎样?

    这段代码解决了这两个问题:

    cnnstr = " Data Source=.\SQLEXPRESS;AttachDbFilename=" & CurDir() & "\datastore.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
    
    Using con As New SqlConnection(cnnstr), 
          cmd As New SqlCommand("insert into tblbackuphistory values( @dateshamsi, @saat, @mas, @user)", con)
    
        cmd.Parameters.Add("@dateshamsi", SqlDbType.DateTime).Value = Convert.ToDatetime(dateshamsi)
        'guessing at column lengths here
        cmd.Parameters.Add("@saat", SqlDbType.VarChar, 50).Value = saat
        cmd.Parameters.Add("@mas", SqlDbType.VarChar, 50).Value = mas
        cmd.Parameters.Add("@user", SqlDbType.NVarChar,50).Value = user
    
        con.Open()
        cmd.ExecuteNonQuery()
    End Using
    

    但是,根据标题中的错误,这并不是故事的全部。听起来连接字符串是错误的,因为datastore.mdf 文件已附加到数据库服务器。如果您刚刚使用 Sql Server Management Studio 创建了这个数据库,则不需要附加它(AttachDbFileName 部分)。您只需将字符串中的Database= 选项设置为您的数据库名称。

    Sql Server Express 作为永远在线的服务运行。它仍然是一个有效的服务器级引擎,不适合作为简单的本地数据存储,即使它可以那样工作。它确实适用于小型工作组和网站。如果您只想为您的应用程序提供本地数据存储,请使用 Sql Server Compact、Sql Server LocalDb、SqlLite 甚至 MS Access。

    【讨论】:

      猜你喜欢
      • 2010-12-10
      相关资源
      最近更新 更多