c # sql вставить.Использование неназначенной локальной переменной? - PullRequest
1 голос
/ 12 марта 2012

Мое приложение говорит, что totalTokens использует неназначенную локальную переменную, и я не понимаю, почему.Должно быть, я упускаю что-то очевидное.Вот линия.Полный код ниже.Спасибо

    myCommand.Parameters.Add("@Tokens", totalTokens);



    private void btnSave_Click(object sender, EventArgs e)
    {
        string date = dateTimePicker1.Value.ToShortDateString();
        bool library = chkLibrary.Checked = true;
        string libReason = txtReason.Text;
        int libMin = Int32.Parse(txtLibTime.Text);
        int hwMin = Int32.Parse(txtHwTime.Text);

        int partialTokens;
        int totalTokens;
        int totalHw;

        // calculate Total homework
        totalHw = libMin + hwMin; 

        // calculate bonus library time
        partialTokens = totalHw / 15;

        // calculate Total tokens
        if (chkLibrary.Checked == true)
        {
            totalTokens = partialTokens + 1;
        }

        using (SqlCeConnection con = new SqlCeConnection(conString))
        {
            SqlCeCommand myCommand = new SqlCeCommand("INSERT INTO ChangeTable" + 
            "(Date, Library, LibMissed, LibTime, HwTime, TotalHomework, Tokens)" +
            "VALUES(@Date, @Library, @LibMissed, @LibTime, @HwTime, @TotalHomework, @Tokens)", con);

            myCommand.Parameters.Add("@Date", date);
            myCommand.Parameters.Add("@Library", library);
            myCommand.Parameters.Add("@LibMissed", libReason);
            myCommand.Parameters.Add("@LibTime", libMin);
            myCommand.Parameters.Add("@HwTime", hwMin);
            myCommand.Parameters.Add("@TotalHomework", totalHw);
            myCommand.Parameters.Add("@TotalHomework", totalTokens);

            con.Open();
            myCommand.ExecuteNonQuery();
            con.Close();

            RefreshGrid();
        }
    }

Ответы [ 6 ]

4 голосов
/ 12 марта 2012

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

Возможно, вы имели в виду что-то вроде:

// calculate Total tokens
if (chkLibrary.Checked == true)
{
  totalTokens = partialTokens + 1;
} else {
  totalTokens = partialTokens;
}

Примечание: Когда вы используете переменную, вы присваиваете два значениятот же параметр, который, конечно, будет перезаписывать первое значение:

myCommand.Parameters.Add("@TotalHomework", totalHw);
myCommand.Parameters.Add("@TotalHomework", totalTokens);

Судя по параметрам, используемым в запросе, оно должно быть:

myCommand.Parameters.Add("@TotalHomework", totalHw);
myCommand.Parameters.Add("@Tokens", totalTokens);
3 голосов
/ 12 марта 2012

totalsTokens будет назначено, только если chkLibrary.Checked равно true.Если это false, то оно останется неназначенным.

1 голос
/ 12 марта 2012

Исправление в основном присваивает ему НЕКОТОРЫЕ виды значений при его создании, например,

int partialTokens = 0;
int totalTokens= 0;
int totalHw = 0;

В настоящее время возможно, что оно будет использоваться без присвоения значения из-за присвоения внутриусловное заявление.

1 голос
/ 12 марта 2012

totalTokens инициализируется только внутри этого условия;таким образом, не гарантируется, что он будет установлен при вызове myCommand.Parameters.Add("@TotalHomework", totalTokens);.

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

1 голос
/ 12 марта 2012

Где эта строка в вашем коде

myCommand.Parameters.Add("@Tokens", totalTokens);

это должно быть между инициализацией myCommand и con.Open ();

1 голос
/ 12 марта 2012
 if (chkLibrary.Checked == true)
        {
            totalTokens = partialTokens + 1;
        }

это единственный раз, когда TotalTokens назначается ..... поэтому, если chkLibrary.Checked не отмечен, то это неназначенная переменная.

Не уверен, что вы хотите, чтобы это былопо умолчанию?но, возможно, когда вы объявляете это, вы хотите

int totalTokens = 0;
...