我在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
答案 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( “”))