VB SQL CommandText属性尚未初始化

时间:2015-01-29 20:42:47

标签: vb.net

我刚接触后台工作人员,我尝试运行以下代码。但我收到了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

我做错了吗?

1 个答案:

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