0

我在 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;
        }
    }
}
4

3 回答 3

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
于 2013-11-01T19:28:51.223 回答
0

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

于 2013-11-01T18:50:34.673 回答
0

您应该进行附加查询以查看视图是否存在,然后显式处理该条件。

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

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

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

于 2013-11-01T20:59:54.163 回答