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视图不存在时中断的主要内容,如果未能解决你的问题,请参考以下文章