我刚接触后台工作人员,我尝试运行以下代码。但我收到了m._Value_CreatedDate = m._MyCMD.ExecuteScalar()
行的运行时错误。错误是:
其他信息:ExecuteScalar:CommandText属性没有 已初始化
Try
Dim m As MyParameters = DirectCast(e.Argument, MyParameters)
m._Con.Open()
m._QueryStr = "SELECT TOP 1 CONVERT(varchar(10),aCreated,103) FROM Account WHERE aMember_ID = " & m._Selected_MemberID & ""
m._MyCMD.CommandType = CommandType.Text
m._Value_CreatedDate = m._MyCMD.ExecuteScalar()
Catch ex As Exception
m._Value_CreatedDate = "N/A"
End Try
以下是我使用的参数
Class MyParameters
Friend _QueryStr As String
Friend _Value_CreatedDate As Object
Friend _AccountID As Object
Friend _Selected_MemberID As String = Committee_Database.GridView1.GetFocusedRowCellValue("Unique ID").ToString
Friend _Con As New SqlConnection('Connection string ommitted)
Friend _MyCMD As New SqlCommand(_QueryStr, _Con)
End Class
请原谅我,如果我做了一些非常错误的事情,我会自学并尝试backgroundworker
。值得注意的是,_QueryStr
将多次更改,因为后台工作程序针对同一个数据库运行多个查询,并且(据我所知)将查询中返回的每个值存储到变量中 - {{1我在这段代码中使用的变量。我已经包含了一个例子,说明我如何回收下面的_Value_CreatedDate
变量,并且每次都将返回的值存储到不同的变量中。
_QueryStr
我做错了吗?
答案 0 :(得分:2)
在类MyParameters
的实现中,使用变量_QueryStr的值直接使用声明初始化SqlCommand。在那个时候,变量_QueryStr尚未初始化,所以它是一个空字符串。
初始化MyParameters
实例后,您可以更改_QueryStr
的值(根据您多次),但这些更改不会自动传递给SqlCommand的CommandText。它仍然包含空的初始值。
您可以解决此问题,为新的QueryStr
属性构建适当的getter和setter。当有人尝试设置属性时,下面的代码会更改内部字段_QueryStr(现在为私有)的值,并重新初始化SqlCommand的CommandText属性。
Class MyParameters
Private _QueryStr As String
Public Property QueryStr() As String
Get
Return _QueryStr
End Get
Set(ByVal value As String)
_QueryStr = value
_MyCMD.CommandText = _QueryStr
End Set
End Property
..... other properties
Friend _MyCMD As New SqlCommand(_QueryStr, _Con)
End Class
现在写的时候
Try
m.QueryStr = "SELECT ...."
....
新命令文本已正确分配给您的命令。
作为旁注:我建议使用普通的ADO.NET对象(或学习如何使用ORM工具)。除非您对这些ADO.NET对象的工作方式有非常深入的了解,否则不要尝试将它们封装在自定义类中。你什么也得不到,并将你的代码暴露给许多问题。例如,您的代码很容易被Sql Injection利用,因为MyParameters类没有使用参数化查询的规定。您的代码没有方法可以关闭和处理类中嵌入的SqlConnection,从而导致资源泄漏。