从sql server数据库中检索数据的正确代码

时间:2010-12-28 23:00:31

标签: c# asp.net sql-server

我在数据库连接方面遇到一些问题,想知道我的代码是否有问题。请查阅。这个问题是相关的: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> &raquo; ";
                    }
                }
            }
            #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(); }
    }
}

我收到的随机错误是:

  • 将请求发送到服务器时发生传输级错误。 (提供者:TCP提供者,错误:0 - 远程主机强行关闭现有连接。)
  • 建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)
  • 超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
  • 无法打开登录请求的数据库“db”。登录失败。用户“root”登录失败。

4 个答案:

答案 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)

有几个不一致需要修复:

  1. description = rdr [“Title”];没有定义适当的铸造。
  2. 每个sql语句使用相同的命令对象,即使您没有清除参数,如果每个sql语句都应使用单独的命令,这将是理想的。
  3. 重定向过多,最好在方法结束时处理重定向。
  4. 检查数据库服务器运行状况,看起来数据库服务器响应不够。
  5. 希望它会有所帮助。

答案 3 :(得分:0)

您确定数据库配置为使用TCP授予远程访问权限吗?