1

私は C# で SQL Server データベースを持っています [現在の仕事に就く前に構築され、作成者はなくなりました]、先週までは問題ありませんでした。最初のページclerk_search.aspxでは、SQL Server で人を検索し、問題のないデータグリッドにポストバックします。

クリックされた ASPImageボタンがあり、次のページに進み、顧客が訪問した理由を入力し、顧客に関するロードされたフィールドを入力します。次のページが表示される人もいれば、表示されない人もいます。使用された SQL ステートメントは、クエリ アナライザーで正常にチェックアウトされますが、わかりません。他の人は正常にログインしており、他の顧客はSQLの行に存在し、問題なくクエリできるため、リーダーではないと思います。すべてが以下に掲載されています。私はコーディングに精通していません。助けてください。

System.InvalidOperationException: データが存在しない場合の無効な読み取り試行。

SqlDataReader reader2 = cmd.ExecuteReader();
reader2.Read();

[InvalidOperationException: データが存在しない場合の無効な読み取り試行。]

ここに実際があります:....clerk_create.aspx.cs

 public partial class clerk_create : System.Web.UI.Page
 {
     protected void Page_Load(object sender, EventArgs e)
     {
        if (Request.Cookies["us"] == null)
         {
             Response.Write("Sorry, you do not have access to this page. Please see    
 data systems.");
             Response.End();
         }

        if (!IsPostBack)
        {
            using (SqlConnection connection = new SqlConnection    
 (WebConfigurationManager.ConnectionStrings["walkin2"].ConnectionString))
            {
                TextBox txtsct = (TextBox)Page.PreviousPage.FindControl("Txtsct");
                Txtsct.Text = txtsct.Text; 
                TextBox txt = (TextBox)Page.PreviousPage.FindControl("Txtssn");
                Txtssn.Text = "" + txt.Text;
                connection.Open();
                string strsql2 = "SELECT dbo.table_name.SSN,   
                dbo.table_name.LAST_NAME,      
                dbo.table_name.FIRST_NAME, dbo.table_name.MIDDLE_INITIAL, 
                dbo.table_name.COMPONENT_CODE, dbo.table_name.PRESENT_CODE FROM 
                dbo.table_name INNER JOIN dbo.table_name ON dbo.table_name.SSN = '" + 
                Txtssn.Text + "')";
                SqlCommand cmd = new SqlCommand(strsql2, connection);
                SqlDataReader reader2 = cmd.ExecuteReader();
                reader2.Read();
                LblLName.Text = "" + reader2["LAST_NAME"];
                LblFName.Text = "" + reader2["FIRST_NAME"];
            }
        }
    }
 ...
}
4

2 に答える 2

0

あなたのコードはいくつかのオブジェクトを適切に破棄しておらず、SQL インジェクションに対して脆弱です。

DTO:

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

コード:

private static readonly Lazy<string> ConnectionString = new Lazy<string>(() => WebConfigurationManager.ConnectionStrings["walkin2"].ConnectionString);
private const string GetEmployeeBySSNQuery = "SELECT dbo.table_name.SSN, dbo.table_name.LAST_NAME, dbo.table_name.FIRST_NAME, dbo.table_name.MIDDLE_INITIAL, dbo.table_name.COMPONENT_CODE, dbo.table_name.PRESENT_CODE FROM dbo.table_name INNER JOIN dbo.table_name ON dbo.table_name.SSN = @SSN";

protected void Page_Load(object sender, EventArgs e)
{
    // ...
    if(!IsPostBack)
    {
        GetEmployeeInformation();
    }
}

private void GetEmployeeInformation()
{
    var sctTextBox = (TextBox)Page.PreviousPage.FindControl("Txtsct");
    Txtsct.Text = txtsct.Text; 
    var ssnTextBox = (TextBox)Page.PreviousPage.FindControl("Txtssn");
    Txtssn.Text = ssnTextBox.Text;

    var ssn = ssnTextBox.Text;

    var employee = GetEmployeeBySSN(ConnectionString.Value, ssn);

    if(employee != null)
    {
        LblFName.Text = employee.FirstName;
        LblLName.Text = employee.LastName;
    }
}

private Employee GetEmployeeBySSN(string connectionString, string ssn)
{
    Employee employee = null;

    using(var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using(var command = new SqlCommand(GetEmployeeBySSNQuery, connection)
        {
            command.Parameters.AddWithValue("@SSN", ssn);

            using(var reader = command.ExecuteReader())
            {
                if(reader.Read())
                {
                    employee = new Employee
                                {
                                    FirstName = Convert.ToString(reader["FIRST_NAME"]),
                                    LastName = Convert.ToString(reader["LAST_NAME"])
                                };
                }
            }
        }
    }

    return employee;
}
于 2013-09-11T15:40:18.853 に答える