0

我正在尝试使用 C# 在 SQL 中读取列类型“uniqueidentifier”

SqlCommand myCommand = new SqlCommand();

myCommand.CommandText = "SELECT templatename, subject, bodyhtml, sender, emailTemplateBodyFields.fieldid FROM emailTemplates left join emailtemplaterecipients on emailtemplates.emailtemplateid = emailtemplaterecipients.emailtemplateid left join emailTemplateBodyFields on emailtemplates.emailtemplateid = emailTemplateBodyFields.emailtemplateid WHERE emailtemplates.emailtemplateid = " + selectedEmailTemplateID;

myCommand.Connection = connection;
SqlDataReader myReader = myCommand.ExecuteReader();

while (myReader.Read())
{
    NewTemplateName = myReader.GetString(0);
    NewSubject  = myReader.GetString(1);
    NewBodyHTML = myReader.GetString(2);
    NewRecipients = myReader.GetString(3);
    myRecipientList.Add(NewRecipients);

    Guid tempGUID = myReader.GetGuid(4);
    NewBodyFields = Convert.ToString(tempGUID);
    myBodyList.Add(NewBodyFields);

但是我得到一个空值异常,数据为空

Guid tempGUID = myReader.GetGuid(4);

当我在 SQL Server 中运行该语句时,该列没有空值。

请告知如何从此列中检索信息。

谢谢。

4

1 回答 1

3

您正在使用LEFT JOINto emailTemplateBodyFields。如果该表中不存在相应的记录,则可能导致结果集中出现空值,即使表fieldid中确实存在的记录从不为空。您可以检查IsDBNull: 的结果,您将看到它为您获得异常的那些行返回 true。

要修复它,要么重新编写查询以确保没有得到空值,要么准备通过IsDBNull在调用之前检查来处理空值GetGuid

对您的代码的两个侧面评论:

  • 是否selectedEmailTemplateID来自用户输入?如果恶意用户决定设置为"1; DROP TABLE emailTemplates"怎么办?然后你的查询会做什么?使用参数。
  • 确保释放您的资源。关键字使这using变得如此简单,以至于这里真的没有借口不这样做。
于 2012-11-15T11:08:25.147 回答