从“MSDB”系统表中读取数据

Posted

技术标签:

【中文标题】从“MSDB”系统表中读取数据【英文标题】:Read Data from 'MSDB' System Table 【发布时间】:2014-07-14 17:56:29 【问题描述】:

在我的应用程序中,我想从 SQL Server 2012 中的数据库“MSDB”中的系统表“sysmail_mailitems”中检索 blind_copy_recipients。我在 C# Web 应用程序中使用实体框架来查询数据库。我为sysmail_mailitems 创建了一个类以及从中读取数据的方法。但它实际上使用此名称在系统表之外创建了一个新表。我的目标不是创建一个表,而只是从现有表中读取。谁能指导我如何做到这一点?

代码:

public class sysmail_mailitem

    [Key]
    public Int32 mailitem_id  get; set; 

    public Int32 profile_id  get; set; 
    public String recipients  get; set; 
    public String copy_recipients  get; set; 
    public String blind_copy_recipients  get; set; 
    public String subject  get; set; 
    public String from_address  get; set; 
    public String reply_to  get; set; 
    public String body  get; set; 
    public String body_format  get; set; 
    public String importance  get; set; 
    public String sensitivity  get; set; 
    public String file_attachments  get; set; 
    public String attachment_encoding  get; set; 
    public String query  get; set; 
    public String execute_query_database  get; set; 
    public Boolean? attach_query_result_as_file  get; set; 
    public Boolean? query_result_header  get; set; 
    public Int32? query_result_width  get; set; 
    public String query_result_separator  get; set; 
    public Boolean? exclude_query_output  get; set; 
    public Boolean? append_query_error  get; set; 
    public DateTime send_request_date  get; set; 
    public String send_request_user  get; set; 
    public Int32? sent_account_id  get; set; 
    public Byte? sent_status  get; set; 
    public DateTime? sent_date  get; set; 
    public DateTime last_mod_date  get; set; 
    public String last_mod_user  get; set; 


public String GetMailRecipients(Int32 mailItemId)

     using(MSDBContext _db = new MSDBContext())
     
         var query = (from mailItems in _db.MailItems
                         where mailItems.mailitem_id == mailItemId
                         select mailItems).FirstOrDefault();
         try
         
                return query.blind_copy_recipients;
         
         catch (NullReferenceException)  
         return "N/A";
     
 


public class MSDBContext : DbContext

    public MSDBContext() : base("msdb")  

    public DbSet<sysmail_mailitem> MailItems  get; set; 

【问题讨论】:

【参考方案1】:

最后我想出了使用 ExecuteStoreQuery 执行原始 sql 命令以从 MSDB 检索数据。

代码:

public String GetMailRecipients(Int32 mailItemId)

   using(context _db = new context())
                                           
        var obj = ((IObjectContextAdapter)_db).ObjectContext;
        return obj.ExecuteStoreQuery<String>("SELECT blind_copy_recipients FROM msdb.dbo.sysmail_mailitems WHERE mailitem_id = 0", mailItemId).FirstOrDefault();                            
    
 

【讨论】:

【参考方案2】:

如果您想以您尝试的初始方式执行此操作,使用 DBSet 等您可以执行此操作。您的问题是,当表名是 sysmail_mailitems(带有 s)时,您调用了类 sysmail_mailitem。因此,您必须像这样在类上方注释实际的表名:

[Table("sysmail_mailitems")]
public class sysmail_mailitem

【讨论】:

以上是关于从“MSDB”系统表中读取数据的主要内容,如果未能解决你的问题,请参考以下文章

从多个表中读取数据的问题[重复]

从两个表中读取数据

使用 SQL 从数据库视图而不是表中读取

如何从 AnyLogic 数据库表中读取分布信息

从表中读取 BigQuery 数值数据类型

从 SQL Server 插入一些数据的表中读取数据的问题