c#当sql视图不存在时中断

Posted

技术标签:

【中文标题】c#当sql视图不存在时中断【英文标题】:c# breaking when sql view doesn't exist 【发布时间】:2013-11-01 18:44:38 【问题描述】:

我在 C# 中有这个函数,它应该从数据库视图中提取公司特定数据并在屏幕上显示该信息。如果出现错误,此函数中的 catch 语句将显示错误消息。如果我在其数据库上没有 AGENT_NAMES 视图的客户端服务器上运行此代码,该函数将显示以下错误:“此时无法建立连接”。相反,我希望该函数确定数据库中是否存在视图,如果不存在,则优雅地转义。我该怎么做?

编辑:正在使用的 DBMS 是 Microsoft SQL Server

private string getAgencyInfo()

    string agentNo = null;
    string agencyInfo = "";

    try
    
        agentNo = Session["Variable_AgencyID"].ToString();
    
    catch
    
        this.lblPopMsg.Text = "Connection timed out, Please Login";
        this.ModalPopupExtender1.Show();
        return agencyInfo;
    

    using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ARConnectionString"].ToString()))
    
        try
        
            cn.Open();
        
        catch
        
            clearLabels();
            this.txtZipCode.Visible = false;
            this.lblZipCode.Visible = false;
            this.lblPopMsg.Text = "Unable to make a Connection at this Time";
            this.ModalPopupExtender1.Show();
            this.txtPolicyNo.Focus();
            return agencyInfo;
        

        try
        
            string agentData = "SELECT AGENT_NAMES.NAME FROM AGENT_NAMES WHERE AGENT_NAMES.AGENT_NO = @agentNo";

            SqlCommand command = new SqlCommand(agentData, cn);
            command.Parameters.Add(new SqlParameter("agentNo", agentNo));
            SqlDataReader dataReader = command.ExecuteReader();
            DataTable dataTable = new DataTable();

            dataTable.Load(dataReader);
            if (dataTable.Rows.Count != 0)
                agencyInfo = dataTable.Rows[0][0].ToString() + " — Agent #" + agentNo;

            return agencyInfo;
        
        catch
        
            clearLabels();
            this.txtZipCode.Visible = false;
            this.lblZipCode.Visible = false;
            this.lblPopMsg.Text = "Unable to make a Connection at this Time";
            this.ModalPopupExtender1.Show();
            this.txtPolicyNo.Focus();
            return agencyInfo;
        
    

【问题讨论】:

您获得了查询相关数据库的系统表的权限,然后您编写了一个查找该视图的查询。详细信息取决于您未能指定的 RDBMS。或者,您可以使用从 .net 返回的异常对象,看看它是否有任何有用的信息。 【参考方案1】:

您可以捕获 SqlException,然后检查具体的错误号:

    catch (SqlException exSQL)
    
        // want to check for number 10034 table or view doesn't exist
        if (exSQL.Number == 10034)
        
          this.lblPopMsg.Text = "view or table doesn't exist.";
        
   

要查看所有数字,您可以在主数据库上运行 SQL 查询:

SELECT * FROM master.dbo.sysmessages

【讨论】:

不推荐对非异常工作流使用异常处理。我并不是说这个回答是正确的。这取决于是否通常期望缺失视图存在。简而言之:“例外应该是例外”【参考方案2】:

您应该进行额外查询以查看视图是否存在,然后明确处理该条件。

这是查看您的视图是否存在的查询:

select * from sys.views where name = 'AGENT_NAMES'

我不会在您每次查询代理名称时都这样做,否则您将进行两倍的数据库调用次数。只需在您的应用程序加载时执行一次。

【讨论】:

【参考方案3】:

您可以对 DB-schema 运行查询以检查视图是否存在。 检查这个http://technet.microsoft.com/en-us/library/ms190324.aspx

【讨论】:

以上是关于c#当sql视图不存在时中断的主要内容,如果未能解决你的问题,请参考以下文章

SQL 错误:ORA-00942 表或视图不存在

表或视图不存在

C# SQL 创建表如果它不存在[重复]

分析存在于运行时中间的代码

SQL 查询存在且不存在

Python:排序函数在存在 nan 时中断