SqlDataReader.GetValue(0)无法获取任何内容



我正在编写一些脚本来读取Intouch环境中的sql查询结果,它不完全是C#语言,但类似。我只想得到";1〃;存储在我的";SQLTest";变量(定义为字符串数据类型(。

这是我的sql查询的结果

这是我的代码:

Dim objDB As System.Data.SqlClient.SqlConnection;
Dim objCmd As System.Data.SqlClient.SqlCommand;
Dim objDR As System.Data.SqlClient.SqlDataReader;
Dim objTbl As System.Data.DataTable;
Dim sDBConnStr As String;
Dim sSQL As String;
Dim bOk As Boolean;
sDBConnStr = "Server=Desktop-3J641FK;Database=Runtime;Integrated Security=True;";
'' Connect and open the database
objDB = New System.Data.SqlClient.SqlConnection(sDBConnStr);
objDB.Open();
sSQL = "SELECT sum (case when EventLogKey = '5' and DetectDateTime between '2022-07-21 11:00:20' and '2022-07-25 11:00:20' then 1 else 0 end) FROM [Runtime].[dbo].[EventHistory]";
'' Invoke the SQL command
objCmd = New System.Data.SqlClient.SqlCommand(sSQL, objDB);
'' Retrieve the queried fields from the query into the reader
objDR = objCmd.ExecuteReader();
InTouch:SQLTesting = objDR.Read();
while objDR.Read() == true
InTouch:SQLTest = objDR.GetValue(0).ToString;
endwhile;

objDR.Close();
objDB.Dispose();
objCmd.Dispose();
InTouch:SQLTesting = objDR.Read();
while objDR.Read() == true

您正在呼叫Read两次,那么您预计会发生什么?

  • 如果正好有一行,只需调用Read
  • 如果将有零行或一行,请使用if语句调用Read
  • 如果可能有多行,请使用while循环调用Read

只执行上述操作之一。如果可能有多行,并且如果没有行,您希望执行不同的操作,请先使用HasRows属性,然后使用while循环。

话虽如此,如果结果集中只有一个值,那么您应该调用ExecuteScalar,因此数据读取器无关紧要:

InTouch:SQLTest = objCmd.ExecuteScalar().ToString();

我认为While循环在这里是不必要的,因为Read是在While之前的sqldata读取器,并且在sql中使用Sum,它将始终返回一个值。试试这个:

InTouch:SQLTesting = objDR.Read();
InTouch:SQLTest = objDR.GetValue(0).ToString;

最新更新