c # Ошибка контекста для переменной, используемой в методе - PullRequest
2 голосов
/ 17 января 2012

У меня проблемы с открытыми переменными и областью видимости.

Вот мой код

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;
        }
    }

Проблема в том, что строка sqlStat в строке «using (var adapter = new SqlDataAdapter. ...)» указывает, что sqlStat «не существует в текущем контексте».

Я стремлюсь добавить много операторов IF для этого метода в зависимости от paramField и paramValues, которые ему передаются, для создания различных sqlStats для заполнения dataCaseViewer.DataSource в зависимости от ввода пользователя. Но если переменную sqlStat из операторов IF невозможно увидеть при последующем вызове в SqlDataAdapter, то я немного застрял.

Любой совет, пожалуйста.

Ответы [ 6 ]

2 голосов
/ 17 января 2012

Это потому, что вы определили sqlStat внутри оператора IF над ним, и это делает его действительным только внутри этого оператора.

Определите sqlStat выше IF, установите его внутри IF, и он должен работать просто отлично.

string sqlStat = System.String.Empty;

if (paramField == "load")
{
    sqlStat = "SELECT...";
1 голос
/ 17 января 2012

Вы присвоили строку внутри оператора if и пытаетесь использовать ее вне ее.

1 голос
/ 17 января 2012
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, чтобы использовать

1 голос
/ 17 января 2012
    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))
    {
      ...

должно работать.

1 голос
/ 17 января 2012

Ну, так сказать - что вы хотите использовать вместо значения, заданного в операторе if, если paramField не"load"? Какой оператор SQL вы бы хотели построить?

Возможно, вам нужно просто объявить paramField вне оператора if и убедиться, что какой бы путь ни был выбран, ему будет присвоено соответствующее значение.

0 голосов
/ 17 января 2012

Не проблема контекста, просто сбой логики.

Вы объявляете sqlstat только если paramfield = "load", так что если это не так. Это не объявлено, и поэтому вы не можете его использовать ....

используйте его внутри if или объявите снаружи, если вы делаете последнее, вам нужно установить его на что-то другое.

string sqlStat = String.Empty;
if (paramfield = "load")
{
sqlstat = "...";
}
else
{
//?
}
using...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...