2012-03-12 10 views
1

私のアプリケーションでは、totalTokensは未割り当てのローカル変数を使用していると言っていますが、なぜそれが表示されていません。私は明らかなものを見逃しているに違いない。ここにラインがあります。完全なコードは以下の通りです。 おかげc#sql insert。割り当てられていないローカル変数の使用?

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

答えて

3

totalsTokensは、chkLibrary.Checkedtrueの場合にのみ割り当てられます。 falseの場合、未割り当てのままです。

1
if (chkLibrary.Checked == true) 
     { 
      totalTokens = partialTokens + 1; 
     } 

これはtotalTokensが割り当てられている唯一の時間です.....そうchkLibrary.Checkedがチェックされていない場合、それは割り当てられていない変数です。

デフォルトでは何をしたいのですか?あなたがそれを宣言するときには、おそらくあなたはmyCommandの初期化とcon.Open()の間にこれを持っている必要があり

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

あなたのコードに

int totalTokens = 0; 
1

のwheresこの行をしたいです。

+0

このコメントにする必要があります。 – Guffa

1

totalTokensは、条件付きでのみ初期化されます。したがって、myCommand.Parameters.Add("@TotalHomework", totalTokens);に電話すると保証されません。

宣言した場所(0など)に初期化するだけで、警告は消えます。

1

修正プログラムは、あなたがそれを作成するときに、値のいくつかの種類を割り当てる基本的に例

現在
int partialTokens = 0; 
int totalTokens= 0; 
int totalHw = 0; 

ため、原因の条件内部割り当てに、割り当てられた値を持たずに使用される可能性ありステートメント。

4

totalTokens変数は、ifステートメントの条件が真である場合にのみ値が割り当てられます。変数には常に値があることを確認する必要があります。

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

サイドノート:あなたは変数を使用する場合、あなたは同じパラメータに2つの値を割り当てている、もちろん最初の値が上書きされます:

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

はおそらく、あなたのような何かを意味し は

クエリで使用されるパラメータから判断すると、それは次のようになります。

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