2016-01-06 108 views
1

我正在尝试基于变量创建DataReader。我需要根据TreeView中的哪个节点被选中来填充一系列TextBoxes,并且父节点数据与子节点数据不同。所以,我写这个代码:基于变量创建DataReader

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["PBRConnectionString"].ConnectionString)) 
{ 
    try 
    { 
     conn.Open(); 
     if (TreeViewAccts.SelectedNode.Parent == null) 
     { 
      // At the parent level, we filter by Account Group ID 
      SqlCommand cmd = new SqlCommand(@"Select [ACCT_GRP_PK], [ACCT_GRP], 'X' as [DOS], [ACTIVE_FLG], [LOAD_BY], [LOAD_TIMESTAMP], [UPDT_BY], [UPDT_TIMESTAMP], [A_FLG_UPDT_BY], [A_FLG_UPDT_TIMESTAMP] from [ACCT_GRP_LIST] where [ACCT_GRP_PK] = @AcctID ORDER BY [ACCT_GRP] ASC", conn); 

      cmd.Parameters.AddWithValue("@AcctID", Convert.ToInt32(TreeViewAccts.SelectedValue.ToString())); 
     } 
     else 
     { 
      // At the child level, we filter by Account ID 
      SqlCommand cmd = new SqlCommand(@"Select [ACCT_PK], [ACCT_NUM], [DOS], [ACTIVE_FLG], [LOAD_BY], [LOAD_TIMESTAMP], [UPDT_BY], [UPDT_TIMESTAMP], [A_FLG_UPDT_BY], [A_FLG_UPDT_TIMESTAMP] from [ACCT_LIST] where [ACCT_PK] = @AcctID ORDER BY [ACCT_NUM] ASC", conn); 

      cmd.Parameters.AddWithValue("@AcctID", Convert.ToInt32(TreeViewAccts.SelectedValue.ToString())); 
     } 

     //Here is the trouble 
     using (SqlDataReader reader = cmd.ExecuteReader()) 
     while (reader.Read()) 
     { 
      txtID.Text = reader.GetByte(0).ToString(); 
      txtName.Text = reader.GetByte(1).ToString(); 
      txtDOS.Text = reader.GetByte(2).ToString(); 
      txtFlag.Text = reader.GetByte(3).ToString(); 
      txtLoadedBy.Text = reader.GetByte(4).ToString(); 
      txtLoadedOn.Text = reader.GetByte(5).ToString(); 
     } 

的问题是,在这条线:

using (SqlDataReader reader = cmd.ExecuteReader()) 

它告诉我,

'加利福尼亚' 不存在的当前上下文。

我假设它是因为它是在那里cmd定义的if/else块之外。

我该如何做这项工作?

回答

3

您需要在if语句之外设置该命令,否则该对象指针仅在if块中和else块中具有作用域。然后您可以在块中分配它。

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["PBRConnectionString"].ConnectionString)) 
{ 
    try 
    { 
     conn.Open(); 
     SqlCommand cmd = null; // declare it here 
     if (TreeViewAccts.SelectedNode.Parent == null) 
     { 
      // At the parent level, we filter by Account Group ID 
      cmd = new SqlCommand(@"Select [ACCT_GRP_PK], [ACCT_GRP], 'X' as [DOS], [ACTIVE_FLG], [LOAD_BY], [LOAD_TIMESTAMP], [UPDT_BY], [UPDT_TIMESTAMP], [A_FLG_UPDT_BY], [A_FLG_UPDT_TIMESTAMP] from [ACCT_GRP_LIST] where [ACCT_GRP_PK] = @AcctID ORDER BY [ACCT_GRP] ASC", conn); 

      cmd.Parameters.AddWithValue("@AcctID", Convert.ToInt32(TreeViewAccts.SelectedValue.ToString())); 
     } 
     else 
     { 
      // At the child level, we filter by Account ID 
      cmd = new SqlCommand(@"Select [ACCT_PK], [ACCT_NUM], [DOS], [ACTIVE_FLG], [LOAD_BY], [LOAD_TIMESTAMP], [UPDT_BY], [UPDT_TIMESTAMP], [A_FLG_UPDT_BY], [A_FLG_UPDT_TIMESTAMP] from [ACCT_LIST] where [ACCT_PK] = @AcctID ORDER BY [ACCT_NUM] ASC", conn); 

      cmd.Parameters.AddWithValue("@AcctID", Convert.ToInt32(TreeViewAccts.SelectedValue.ToString())); 
     } 
2

MSDN

如果你声明块结构中的变量,如if语句,该变量的作用域只有等到块的结尾。终身是直到程序结束。

的问题是,你在你的if-else块的范围内定义的变量cmd,所以它不是那些块以外为人所知。解决方法是声明if-else块中的cmd。像这样:

try 
{ 
    SqlCommand cmd = null; 
    .... 
    if (TreeViewAccts.SelectedNode.Parent == null) 
    { 
     cmd = new SqlCommand(@"Select [ACCT_GRP_PK], [ACCT_GRP], 'X' as [DOS], [ACTIVE_FLG], [LOAD_BY], [LOAD_TIMESTAMP], [UPDT_BY], [UPDT_TIMESTAMP], [A_FLG_UPDT_BY], [A_FLG_UPDT_TIMESTAMP] from [ACCT_GRP_LIST] where [ACCT_GRP_PK] = @AcctID ORDER BY [ACCT_GRP] ASC", conn); 
     .... 
    } 
    else 
    { 
     // At the child level, we filter by Account ID 
     cmd = new SqlCommand(@"Select [ACCT_PK], [ACCT_NUM], [DOS], [ACTIVE_FLG], [LOAD_BY], [LOAD_TIMESTAMP], [UPDT_BY], [UPDT_TIMESTAMP], [A_FLG_UPDT_BY], [A_FLG_UPDT_TIMESTAMP] from [ACCT_LIST] where [ACCT_PK] = @AcctID ORDER BY [ACCT_NUM] ASC", conn); 
     .... 
    } 
}