如果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。