如何在Visual Basic ASP.NET Web应用程序项目中通过指定列名来读取行的SQL列

时间:2014-07-12 15:40:33

标签: asp.net sql sql-server sqldatareader

我在SQL Server 2008数据库中有一个表。

如何在执行SqlDataReader之后在SELECT * FROM table WHERE <row selection>中指定列名称来阅读行的列值?

错误是:&#34;附加信息:没有数据时无效尝试读取。&#34;如果我在.Close()和&#34之前执行.GetString;当读取器关闭时,无效尝试调用CheckDataIsReady。&#34;如果我关闭然后做GetString。或者应该是GetSqlString()?

这是我的SQL命令:

SELECT * FROM CLIENT_JOBS_TABLE WHERE CLIENT_ID = 'JOES_BURGERS' AND JOB_ID = 'FRY_COOK_2014_07_05'

在下面的代码中,我在尝试读取列JOB_ID的值时遇到错误。

some_data = query_result2.GetString(field_ordinal)    '  field_ordinal=1 

..得到错误:&#34;类型&#39; System.InvalidOperationException&#39;的第一次机会异常发生在System.Data.dll&#34; ..和&#39; some_data&#39;没有设置

Private Function query_SQL_database(ByVal sql_text_command As String, ByRef query_result As SqlDataReader)
   ' Open the connection
   Debug.WriteLine(sql_text_command)
   ConnectionString = "Data Source=66.7.250.100;Initial Catalog=ehiresdb;Persist Security Info=True;User ID=Doug;Password=ThankYou!!"
   Dim connection As New SqlConnection(ConnectionString)
   connection.ConnectionString = ConnectionString
   connection.Open()
   SQL_command = New SqlCommand(sql_text_command, connection)
   Dim command_successful = True
   On Error Resume Next

   Dim query_result2 As SqlDataReader
   query_result2 = SQL_command.ExecuteReader()
   If Err.Number Then
       command_successful = False
       Dim reason = Err.Description
       MsgBox(Err.Description, MsgBoxStyle.Exclamation, "issue_SQL_command")
   Else
       command_successful = True
   End If

query_result2.Read()&#39; &LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT; &LT;&LT;&LT;解决方案!

   field_ordinal = query_result2.GetOrdinal("CLIENT_ID")
   field_ordinal = query_result2.GetOrdinal("JOB_ID")
   some_data = query_result2.GetString(field_ordinal)       <<<<< FAILS BEFORE THE .CLOSE

   connection.Close()



   Return command_successful
End Function  'issue_SQL_command 

2 个答案:

答案 0 :(得分:1)

没有(在System.Data.SqlClient命名空间中)reader.GetInt32(或GetString,GetBoolean等...)的版本,它接受列的字符串名称。您可以使用序号位置检索列的值,并且从GetOrdinal返回的值中,您可以获得相应列的值。

上面的代码有另一个问题。在创建阅读器之后,您需要调用Read()方法,将读取器放在查询返回的第一条记录上。该调用返回True id,查询生成任何要读取的行,否则您的查询未返回任何记录。

if query_result.Read() then
    job_table_client_id = query_result.GetOrdinal("JOB_TABLE_CLIENT_ID")   
    return query_result.GetString(job_table_client_id)
else
    return string.Empty
End If

但是你可以写一个extension method in VB.NET

Imports System.Runtime.CompilerServices

Module SqlDataReaderExtensions

    <Extension()> 
    Public Function GetInt32(ByVal reader As SqlDataReader, ByVal columnName As String) as Int32
        Dim result As Integer = 0
        Dim pos = reader.GetOrdinal(columnName)
        if pos >= 0 then
             result = reader.GetInt32(pos)
        End If
        return result
    End Function

    <Extension()> 
    Public Function GetString(ByVal reader As SqlDataReader, columnName As String) as String
        ......
    End Function

End Module

现在你可以打电话了

return query_result.GetInt32("JOB_TABLE_CLIENT_ID")   

请注意,这只是一个例子。我没有进行任何测试,更重要的是,如果您尝试传递包含不同数据类型值的不相关列或列,则无法安全处理列中的空值或任何类型的保护

答案 1 :(得分:0)

我明白了。

解决方案1:

我错过了这条线:

query_result.Read()

使用.GetString

之前的

解决方案2:

此外,必须在connection.Close()之前使用以下方法检索列值:

query_result.GetString(query_result2.GetOrdinal( “”))