c#方法中使用的变量上下文错误

时间:2012-01-17 16:02:12

标签: c# sql

我对public -v-private变量和范围有点疑问。

这是我的代码

private void PopulateCaseViewer(string paramField, string paramValue)
    {
        string strConnection = BuildConnectionString();
        SqlConnection linkToDB = new SqlConnection(strConnection);

        if (paramField == "load")
        {
            string sqlStat = "SELECT c.CaseNo, c.Claimant, c.Defendant, c.DOA, c.CaseType, c.CaseManager, c.Occupation, c.DateInstruction " +
                             "a.IPName, a.IPRegion, l.IPReference " +
                             "FROM tblCases AS c INNER JOIN tblIPLinks as l ON c.CaseNo = l.CaseNo " +
                             "JOIN tblIPAddresses AS a ON l.IPID = a.IPID;";
        }
        using (linkToDB)
        using (var adapter = new SqlDataAdapter(sqlStat, linkToDB))
        {
            var table = new DataTable();
            adapter.Fill(table);
            dataCaseViewer.DataSource = table;
        }
    }

问题是,“using(var adapter = new SqlDataAdapter。...)”行中的字符串sqlStat表明sqlStat“在当前上下文中不存在”。

我的目标是在此方法上添加许多IF语句,具体取决于传递给它的paramField和paramValues,以便构建不同的sqlStats以根据用户输入填充dataCaseViewer.DataSource。但是如果SqlDataAdapter中的后续调用无法看到来自IF语句的sqlStat变量,那么我有点卡住了。

请提出任何建议。

6 个答案:

答案 0 :(得分:2)

那是因为你在它上面的IF语句中定义了sqlStat,这使得它只在该语句中有效。

在IF上面定义sqlStat,在IF中设置它,它应该可以正常工作。

string sqlStat = System.String.Empty;

if (paramField == "load")
{
    sqlStat = "SELECT...";

答案 1 :(得分:1)

那就这么说吧 - 如果if 不是“加载”,您希望使用什么而不是paramField语句中指定的值?你期望构建什么SQL语句?

您可能需要声明 paramField语句之外的if,并确保无论采用何种路径,都会在您之前为其分配适当的值用它。

答案 2 :(得分:1)

    string sqlStat;    
    if (paramField == "load")
    {
        sqlStat = "SELECT c.CaseNo, c.Claimant, c.Defendant, c.DOA, c.CaseType, c.CaseManager, c.Occupation, c.DateInstruction " +
                         "a.IPName, a.IPRegion, l.IPReference " +
                         "FROM tblCases AS c INNER JOIN tblIPLinks as l ON c.CaseNo = l.CaseNo " +
                         "JOIN tblIPAddresses AS a ON l.IPID = a.IPID;";
    }
    using (linkToDB)
    using (var adapter = new SqlDataAdapter(sqlStat, linkToDB))
    {
      ...

应该有用。

答案 3 :(得分:1)

private void PopulateCaseViewer(string paramField, string paramValue)
    {
        string strConnection = BuildConnectionString();
        SqlConnection linkToDB = new SqlConnection(strConnection);

        if (paramField == "load")
        {
            string sqlStat = "SELECT c.CaseNo, c.Claimant, c.Defendant, c.DOA, c.CaseType, c.CaseManager, c.Occupation, c.DateInstruction " +
                             "a.IPName, a.IPRegion, l.IPReference " +
                             "FROM tblCases AS c INNER JOIN tblIPLinks as l ON c.CaseNo = l.CaseNo " +
                             "JOIN tblIPAddresses AS a ON l.IPID = a.IPID;";

          using (linkToDB)
          using (var adapter = new SqlDataAdapter(sqlStat, linkToDB))
          {
            var table = new DataTable();
            adapter.Fill(table);
            dataCaseViewer.DataSource = table;
          }
        }
    }

slqStat在IF中定义..因此你需要使用if中的所有内容

答案 4 :(得分:1)

您在if语句中分配了字符串,并尝试在其外部使用它。

答案 5 :(得分:0)

不是上下文问题,只是逻辑失败。

如果paramfield =“load”,你只声明sqlstat,所以如果没有。它没有声明,所以你不能使用它....

在if中使用它或在外面声明它,如果你执行后者,你需要将它设置为其他东西。

string sqlStat = String.Empty;
if (paramfield = "load")
{
sqlstat = "...";
}
else
{
//?
}
using...