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

3

您应该检查方法的返回值 Read

如果 read 方法返回false,则没有更多数据。在这种情况下,您不应该从阅读器读取数据。这样做会导致此异常。

如果你确定你只会得到一个记录试试这个

if(reader2.Read())
{
    LblLName.Text = "" + reader2["LAST_NAME"];
    LblFName.Text = "" + reader2["FIRST_NAME"];
}

通常DataReader如下使用,因为它可以包含许多记录

while (reader2.Read())
{
    //Consume reader using reader2["Column"] etc
}
于 2013-09-11T15:15:57.830 回答
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 回答