从MSDB'中读取数据系统表

时间:2014-07-14 17:56:30

标签: c# sql-server entity-framework system-tables

在我的应用程序中,我想从系统表' sysmail_mailitems'中检索blind_copy_recipients。来自数据库' MSDB'在SQL Server 2012中。我在C#Web应用程序中使用Entity Framework来查询数据库。我为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; }
}

2 个答案:

答案 0 :(得分:0)

最后,我想出了使用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();                            
    }
 }

答案 1 :(得分:0)

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

[Table("sysmail_mailitems")]
public class sysmail_mailitem
{