我在数据库连接方面遇到一些问题,想知道我的代码是否有问题。请查阅。这个问题是相关的:Switch between databases, use two databases simultaneously问题。
cs="Data Source=mywebsite.com;Initial Catalog=database;User Id=root;Password=toor;Connect Timeout=10;Pooling='true';"
using (SqlConnection cnn = new SqlConnection(WebConfigurationManager.ConnectionStrings["cs"].ConnectionString))
{
using (SqlCommand cmmnd = new SqlCommand("", cnn))
{
try
{
cnn.Open();
#region Header & Description
cmmnd.Parameters.Add("@CatID", SqlDbType.Int).Value = catId;
cmmnd.CommandText = "SELECT UpperID, Title, Description FROM Categories WHERE CatID=@CatID;";
string mainCat = String.Empty, rootCat = String.Empty;
using (SqlDataReader rdr = cmmnd.ExecuteReader())
{
if (rdr.Read())
{
mainCat = rdr["Title"].ToString();
upperId = Convert.ToInt32(rdr["UpperID"]);
description = rdr["Title"];
}
else { Response.Redirect("/", false); }
}
if (upperId > 0) //If upper category exists add its name
{
cmmnd.Parameters["@CatID"].Value = upperId;
cmmnd.CommandText = "SELECT Title FROM Categories WHERE CatID=@CatID;";
using (SqlDataReader rdr = cmmnd.ExecuteReader())
{
if (rdr.Read())
{
rootCat = "<a href='x.aspx'>" + rdr["Title"] + "</a> » ";
}
}
}
#endregion
#region Sub-Categories
if (upperId == 0) //show only at root categories
{
cmmnd.Parameters["@CatID"].Value = catId;
cmmnd.CommandText = "SELECT Count(CatID) FROM Categories WHERE UpperID=@CatID;";
if (Convert.ToInt32(cmmnd.ExecuteScalar()) > 0)
{
cmmnd.CommandText = "SELECT CatID, Title FROM Categories WHERE UpperID=@CatID ORDER BY Title;";
using (SqlDataReader rdr = cmmnd.ExecuteReader())
{
while (rdr.Read())
{
subcat.InnerHtml += "<a href='x.aspx'>" + rdr["Title"].ToString().ToLower() + "</a>\n";
description += rdr["Title"] + ", ";
}
}
}
}
#endregion
}
catch (Exception ex) { HasanG.LogException(ex, Request.RawUrl, HttpContext.Current); Response.Redirect("/", false); }
finally { cnn.Close(); }
}
}
我收到的随机错误是:
答案 0 :(得分:3)
这里没有真正的问题。
你最终不需要无关的{cnn.close();因为using子句会为你处理。然而,改变它将完全没有影响。
另一件事是我会将带有重定向的using子句放在using子句之外。但是,再一次,我认为这不会影响被召唤的处置。
有趣的是,如果你总是正确处理你的连接,你会得到连接池错误(超时到期),如你所示。
这使我们只有一个真正的解决方案:切换托管服务提供商。他们要么将数据库服务器过载到无法使用的地步,要么网络设置中的某些硬件元素(网卡,交换机,路由器等)都很糟糕,丢包。
答案 1 :(得分:1)
如果您要远程连接到数据库提供商,则需要查看几种可能性,例如您自己的网络配置,防火墙设置等。
使用数据包嗅探器来确定丢失的数据包是否是问题。
在本地计算机上建立连接池,服务器建立连接。如果数据库提供程序仅允许5个连接,并且您的连接池设置为50个连接,那么......您可以进行数学运算。看起来你正在关闭连接,所以没有问题。
True ...“description = rdr [”Title“];”,“应该是”description = rdr [“Description”]。ToString()“?
不需要在SqlCommand对象周围放置一个using语句,因为你正在使用ad-hoc查询,所以只需使用string.Format(“sql test {0}”,param)。这样,您可以重用SqlCommand对象,而无需清除参数。
我在这里看到的最大问题是您将表示层与业务层与数据源层混合在一起。转储try ... catch并允许业务层处理日志记录。将对象返回到表示层并允许它执行重定向。保持数据源层非常简单...获取数据并返回实体。业务层可以处理实体本身的任何业务逻辑。
未找到SQL Server可能是您的错误或提供商...如果提供商经常出错,请更改提供商。
答案 2 :(得分:1)
有几个不一致需要修复:
希望它会有所帮助。
答案 3 :(得分:0)
您确定数据库配置为使用TCP授予远程访问权限吗?