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,从而导致资源泄漏。