VB SQL CommandText 属性 尚未初始化
VB SQL CommandText property has not been initialized
我刚开始使用后台工作人员,我正在尝试 运行 以下代码。但是我在 m._Value_CreatedDate = m._MyCMD.ExecuteScalar()
行收到 运行 次错误。错误是:
Additional information: ExecuteScalar: CommandText property has not
been initialized
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
将随着后台工作人员 运行 对同一数据库的多次查询而多次更改,并且(据我所知)将查询的每个返回值存储到变量中 - _Value_CreatedDate
是我在此代码中使用的变量。我在下面提供了一个示例,说明我如何在下面回收 _QueryStr
变量并将返回值每次存储到不同的变量中。
Try
m._QueryStr = "SELECT TOP 1 aAccount_ID FROM Account WHERE aUser_Name='" & _Selected_AccountID & "'"
m._MyCMD.CommandType = CommandType.Text
m._AccountID = m._MyCMD.ExecuteScalar()
Catch ex As Exception
End Try
我是不是做错了什么?
在 class 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 工具)。不要尝试将它们封装在自定义 classes 中,除非您对这些 ADO.NET 对象的工作原理有非常深刻的理解。您一无所获,并使您的代码面临许多问题。例如,您的代码很容易被 Sql Injection 利用,因为 MyParameters class 没有使用参数化查询的规定。您的代码无法关闭和处置嵌入在您的 class 中的 SqlConnection,从而导致资源泄漏。
我刚开始使用后台工作人员,我正在尝试 运行 以下代码。但是我在 m._Value_CreatedDate = m._MyCMD.ExecuteScalar()
行收到 运行 次错误。错误是:
Additional information: ExecuteScalar: CommandText property has not been initialized
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
将随着后台工作人员 运行 对同一数据库的多次查询而多次更改,并且(据我所知)将查询的每个返回值存储到变量中 - _Value_CreatedDate
是我在此代码中使用的变量。我在下面提供了一个示例,说明我如何在下面回收 _QueryStr
变量并将返回值每次存储到不同的变量中。
Try
m._QueryStr = "SELECT TOP 1 aAccount_ID FROM Account WHERE aUser_Name='" & _Selected_AccountID & "'"
m._MyCMD.CommandType = CommandType.Text
m._AccountID = m._MyCMD.ExecuteScalar()
Catch ex As Exception
End Try
我是不是做错了什么?
在 class 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 工具)。不要尝试将它们封装在自定义 classes 中,除非您对这些 ADO.NET 对象的工作原理有非常深刻的理解。您一无所获,并使您的代码面临许多问题。例如,您的代码很容易被 Sql Injection 利用,因为 MyParameters class 没有使用参数化查询的规定。您的代码无法关闭和处置嵌入在您的 class 中的 SqlConnection,从而导致资源泄漏。