我正在尝试从SQL语句发送包含多个数据的电子邮件,但我无法将SQL语句的结果保存在变量中。
str = "SELECT Test.*,TestTopicScore.[Easy Question Score],TestTopicScore.[Medium Question Score],TestTopicScore.[Hard Question Score] from Test INNER JOIN TestTopicScore on Test.TestID = TestTopicScore.TestID ORDER BY Test.Score DESC"
mycommand = New OleDbCommand(str, myconnection)
myReader = mycommand.ExecuteReader
myReader.Read()
emailcontents = myReader("emailcontents")
与访问数据库的连接很好并且数据被读取但我不能将其保存在变量中。
我得到的错误:
An unhandled exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll
其他信息:emailcontents
答案 0 :(得分:1)
让我们先查看您的查询,我稍微格式化了一下,以便更容易看到正在发生的事情:
SELECT Test.*
,TestTopicScore.[Easy Question Score]
,TestTopicScore.[Medium Question Score]
,TestTopicScore.[Hard Question Score]
FROM Test
INNER JOIN TestTopicScore
ON Test.TestID = TestTopicScore.TestID
ORDER BY Test.Score DESC
这样做是选择几个不同的字段,而不是一个值。您的代码emailcontents = myReader("emailcontents")
尝试读取一个字段,该字段名为" emailcontents"。不幸的是,没有这样的命名领域。
更糟糕的是:你甚至不知道有多少字段Test.*
会返回。
因此,首先要从Test
枚举所有字段。
然后,您似乎只想要一个字符串作为结果,因此您需要将字段连接为字符串,而不是单独返回它们。
在Access中,将字符串连接在一起的运算符为&
,它应该为您将数值转换为字符串,因此:
SELECT Test.SomeField & Chr(13) & Chr(10)
& Test.SomeOtherField
& Test.AnotherField
& TestTopicScore.[Easy Question Score]
& TestTopicScore.[Medium Question Score]
& TestTopicScore.[Hard Question Score]
AS [emailcontents]
FROM Test
INNER JOIN TestTopicScore
ON Test.TestID = TestTopicScore.TestID
ORDER BY Test.Score DESC
请注意我如何将& Chr(13) & Chr(10)
放在Test.SomeField
和Test.SomeOtherField
之间:这两者之间有一个新的界限。您可能希望在所有字段之间执行此操作。
另外,我使用AS
为连接数据命名。
现在我们必须将输出格式化到数据库中,从而陷入非常混乱的境地。你不想这样做。让我强调这一点,以便突出显示:更好的方法是在VB.NET代码中单独读取所有字段并将其格式化为字符串。
ETA :不仅如此,但看起来您可能会返回多组结果(来自ORDER BY
),在这种情况下,您必须阅读所有内容结果循环。