0

我正在运行 C# .NET 代码,我需要测试已在网页表单中输入然后传递到服务器的某些值。然后,服务器在查询字符串中使用这些值来返回一个值。我将这些查询指令封装在一个 try-catch 块中,以便跟踪任何 Sql 异常。
问题是这样的:一旦应用程序启动,连接字符串被设置,查询运行,我没有从 catch 块的 SQL 异常中得到堆栈跟踪,而是在方法中得到一个空白/空值运行查询。该方法将返回一个布尔变量以指示是否从查询中读取了任何值,如果是,则返回 true 但是它总是返回 false 这不应该发生,因为我已经检查了它通过将其粘贴到 MS SQL 2008 中构建的查询字符串查询控制台并运行它。运行粘贴的 SQL 指令测试的结果确实会从查询中生成非空数据。非常感谢您的帮助。

我正在使用 IIS 6.0 运行 VS2003 并使用 MS SQL 2008 Enterprise Studio

这是 web.config 和 C# 代码的代码段。非常感谢您的帮助。:

<system.web>

    <!--  DYNAMIC DEBUG COMPILATION
          Set compilation debug="true" to enable ASPX debugging.  Otherwise, setting this value to
          false will improve runtime performance of this application. 
          Set compilation debug="true" to insert debugging symbols (.pdb information)
          into the compiled page. Because this creates a larger file that executes
          more slowly, you should set this value to true only when debugging and to
          false at all other times. For more information, refer to the documentation about
          debugging ASP.NET files.
    -->
    <compilation defaultLanguage="c#" debug="true" />

=====================

//This method takes one string and returns either country name or Canadian state as a string, according to query.
    private string candStateCountryCheck(string strQuery)
    {
        string strStateCountry = "";
        SqlConnection con = null;
        SqlCommand cmd = null;
        SqlDataReader sdr = null;

        try
        {   
            string strConnection = ConfigurationSettings.AppSettings["OLEDBConnectionString"];
            con = new SqlConnection(strConnection);
            con.Open();
            cmd = new SqlCommand(strQuery, con);
            sdr = cmd.ExecuteReader();

            if(sdr.Read())
            {
                strStateCountry = sdr.GetString(0);
            }
        }
        catch (Exception exc)
        {
            ErrorLabel.Text = "ERROR:" + exc.Message;
        }
        finally 
        {
            if (sdr != null)
                sdr.Close();
            if (cmd != null)
                cmd.Dispose();
            if (con != null)
                con.Close();
        }
        return strStateCountry;
    }
4

2 回答 2

0

这应该可行,但我认为您应该ExecuteScaler用于单一结果查询。我还鼓励您使用参数化查询:

 while (sdr.Read())
 {
     strStateCountry = sdr.GetString(0);
 }

ExucuteScaler例子:

    try
    {
        string strConnection = ConfigurationSettings.AppSettings["OLEDBConnectionString"];
        using(SqlConnection con = new SqlConnection(strConnection))
        {
             con.Open();
             using(SqlCommand cmd = new SqlCommand(strQuery, con))
             {
                 strStateCountry = (String)cmd.ExecuteScalar();
             }
        }

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
于 2012-07-24T15:10:53.283 回答
0

我会尽量避免任何不适用于 VS2003 的东西,但这会很难...... VS2003 现在已经很老了,你知道 VS2010 的快速版是免费的,对吧?

此外,如果它使用的是虚构的数据库,这是对您的代码的重新编写,以展示它应该如何看待的更好示例。您没有共享任何数据库结构、任何示例数据或查询的外观,所以这是我们目前能做的最好的事情:

private string candStateCountryCheck(string toTest)
{
    string sql = "SELECT countryStateName FROM SomeTable WHERE ItemKey LIKE @Query + '%';";

    try
    {   
        string strConnection = ConfigurationSettings.AppSettings["OLEDBConnectionString"];

        con = new SqlConnection(strConnection);
        cmd = new SqlCommand(sql, con);

        cmd.Parameters.Add("@Query", SqlDbType.VarChar, 50).Value = toTest;

        con.Open();
        return cmd.ExecuteScalar().ToString();
    }
    catch (Exception exc)
    {
        ErrorLabel.Text = "ERROR:" + exc.Message;
    }
    finally 
    {
        cmd.Dispose();
        con.Dispose();
    }
}

永远不想编写期望完整的 sql 代码作为参数的方法。

于 2012-07-24T15:20:46.607 回答