我正在编写一些脚本来读取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;