1

私はこのコードスニペットを持っています:

変数mは、最初のsqlコマンドによって返されるNameとして設定された文字列であり、閉じられてから、2番目のコマンドが他の詳細を返すために使用されます。この時点で、mはビューにデータを入力するために使用されますが、VisualStudioはそれが割り当てられていない変数であると言います。これを修正するにはどうすればよいですか?

SqlCommand mcom = new SqlCommand("SELECT * FROM [Rica].[dbo].[MaritialStatus] WHERE ID=" + myReader["MaritalStatusID"], mnner);

SqlDataReader mread = null;
mread = mcom.ExecuteReader();

while (mread.Read())
{
    m = mread["Name"].ToString();
}
mnner.Close();

user_table.Text = user_table.Text + "<tr><td>"+ myReader["PostCode"] +"</td>";

//user details
SqlConnection inner = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["RicaConnectionString"].ConnectionString);
inner.Open();

SqlCommand icom = new SqlCommand("SELECT * FROM [Rica].[dbo].[User] WHERE ID=" + myReader["ID"], inner);

SqlDataReader iread = null;
iread = icom.ExecuteReader();

while (iread.Read())
{
    user_table.Text = user_table.Text + "<td>" + iread["NamePrefix"] + " " + iread["FirstName"] + " " + iread["LastName"] + "</td><td>" + iread["Username"] + "</td><td>" + g + "</td><td>" + m + "</td></tr>";
}

iread.Close();
4

2 に答える 2

3

コンパイラは完全に正しく、m割り当てられていません。たとえば、返される行がない可能性があります。行がない場合に使用する初期値を設定するだけです。次に例を示します。

string m = null;

より具体的には、while/foreachなどの割り当ての場合、 while/の後の「明確な割り当て」は、foreachの「明確な割り当て」と同じです。これは、反復が実行されなかった可能性があるためです(つまり、空のセットを超えた場合、またはテストはすぐに戻ります)。foreachwhilefalse

また、現在のコードには多くの問題があることにも注意する必要があります。多くの欠落usingしているSQLインジェクションの脆弱性(これらは潜在的に大きな問題です)など、xssの脆弱性(これも大きな問題です)。

dapper-dot-netのようなツールを使用すると、SQLインジェクションが修正され、コマンド/リーダーの正しい処理を処理して、パラメーター化と読み取りが非常に簡単になります。xssの問題は、htmlエンコードで正しく対処する必要があります。実際には、SQLコードとHTMLコードがこのように隣り合っていることはめったにありません。

于 2012-07-26T08:10:13.747 に答える
2

ローカル変数は最初は割り当てられていないため、使用する前に割り当て/初期化する必要があります。

string m=string.Empty;
于 2012-07-26T08:09:06.970 に答える