Vb.net VB SQL CommandText属性尚未初始化

Vb.net VB SQL CommandText属性尚未初始化,vb.net,Vb.net,我刚开始使用后台工作人员,我正在尝试运行以下代码。但是我在m.\u Value\u CreatedDate=m.\u MyCMD.ExecuteScalar()行上收到一个运行时错误。错误是: 其他信息:ExecuteScalar:CommandText属性尚未设置 已初始化 以下是我使用的参数: Class MyParameters Friend _QueryStr As String Friend _Value_CreatedDate As Object

我刚开始使用后台工作人员,我正在尝试运行以下代码。但是我在
m.\u Value\u CreatedDate=m.\u MyCMD.ExecuteScalar()
行上收到一个运行时错误。错误是:

其他信息:ExecuteScalar:CommandText属性尚未设置 已初始化

以下是我使用的参数:

 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
进行实验。值得注意的是,
\u QueryStr
将在后台工作人员对同一数据库运行多个查询时多次更改,并且(据我所知)将查询返回的每个值存储到变量中-
\u Value\u CreatedDate
是我在此代码中使用的变量。我在下面的示例中介绍了如何循环使用
\u 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

我做错什么了吗

在类的实现中
MyParameters
使用变量_QueryStr的值直接用声明初始化SqlCommand。此时变量_QueryStr尚未初始化,因此它是一个空字符串

初始化
MyParameters
的实例后,您可以更改
\u QueryStr
的值(根据您的情况更改多次),但这些更改不会自动传递到SqlCommand的CommandText。它仍然包含空的初始值

您可以解决这个问题,为新的
QueryStr
属性构建适当的getter和setter。当有人试图设置属性时,下面的代码会更改内部字段_QueryStr(现在为private)的值,并重新初始化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对象的工作原理有非常深入的了解,否则不要尝试将它们封装在自定义类中。您将一无所获,代码将面临许多问题。例如,您的代码很容易利用,因为MyParameters类没有使用参数化查询的规定。您的代码没有方法关闭和处理嵌入在类中的SqlConnection,从而导致资源泄漏。

事实上,我的问题不同,但这个答案让我想到了捕获错误的方法。我使用Asynchronus DataReader获取数据,我的旧代码甚至直接更改CommandText,因为它在错误的位置更改。生成任务变量和等待操作之间的更改。SqlCommand属性的所有更改均未反映任务操作。我不敢相信这个bug会消耗我一整天的时间,谢谢你帮我解决这个bug。
Try
   m.QueryStr = "SELECT ...."
   ....