0

Webページフォームに入力されてサーバーに渡された特定の値をテストする必要があるC#.NETコードを実行しています。次に、サーバーはクエリ文字列でこれらの値を使用して値を返します。SQL例外をトレースするために、これらのクエリ命令をtry-catchブロック内に入れます。
問題は次のとおりです。アプリケーションが起動し、接続文字列が設定され、クエリが実行されると、catchブロックのSQL例外からスタックトレースを取得せず、代わりにメソッド内で空白/空の値を取得します。クエリを実行しました。このメソッドはブール変数を返し、クエリから読み取られた値があるかどうかを示します。値があればtrueを返しますが、常にfalseを返します。これは、MSSQL2008に貼り付けて作成したクエリ文字列を確認したためです。クエリコンソールとそれを実行します。貼り付けられたSQL命令テストを実行した結果は、クエリからnull以外のデータを生成します。よろしくお願いします。

IIS 6.0でVS2003を実行していて、MS SQL 2008EnterpriseStudioを使用しています

これが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 に答える