C# 在运行时使用未分配的局部变量

C# 在运行时使用未分配的局部变量,c#,wpf,sql-server-2005,C#,Wpf,Sql Server 2005,wpf应用程序实际上我创建了帐户应用程序我去显示期初金额。期初金额等于存托凭证金额-存托凭证金额。dr_amt和cr_amt是我可以做的amt表的列名 double a, b, c; SqlConnection con = new SqlConnection("my conn"); SqlCommand cmd = new SqlCommand("select sum(dr_amt),sum(cr_amt) from amt where id='"+tex1.Text+"'", con);

wpf应用程序实际上我创建了帐户应用程序我去显示期初金额。期初金额等于存托凭证金额-存托凭证金额。dr_amt和cr_amt是我可以做的amt表的列名

double a, b, c;

SqlConnection con = new SqlConnection("my conn");

SqlCommand cmd = new SqlCommand("select sum(dr_amt),sum(cr_amt) from amt where id='"+tex1.Text+"'", con);


con.Open();

SqlDataReader dr = cmd.ExecuteReader();

while (dr.Read())

{
    a = Convert.ToDouble(dr[0]);
    b = Convert.ToDouble(dr[1]);
}
c = a - b;

textBox3.Text =Convert.ToString( c);
在bulid这段代码中,我看到了未赋值局部变量'a'和'b'的错误用法。我该怎么做

在bulid代码中,我看到未赋值局部变量'a'和'b'的错误用法

是的,你愿意。它们没有明确分配,因为
while
循环可能无法执行

如果没有行,您希望得到什么结果?这个问题的答案将决定你应该做什么。(另外,如果有多行,则只有最后一行会产生结果-这是故意的吗?)

例如,您可以给他们一个值作为开始:

double a = 0, b = 0, c;
如果没有行,则结果为0。如果那是你想要的

(请注意,我会尽可能晚地声明变量。)


此外,请使用参数化SQL。您当前的代码易受攻击。哦,使用
语句来确保适当地关闭命令和异常。

您需要设置a和b,因为当dr中没有数据时,while循环甚至不会执行一次迭代

double a = 0, b = 0, c;

Jon的建议(与代码的SQL注入漏洞有关)解释如下。请听从他的建议@用户1464596:我给了你一段代码。。。但实际上,你应该仔细阅读这些建议,然后试着自己去遵循。如果我只是填鸭式地给你输入代码,你下次就不太可能学习了;输出是给定
id
的聚合(两个
SUM
s),没有分组。@AaronBertrand:对,我们可以从SQL中知道这一点,但我很可能在代码中也声明了这一点。(每当您有一个
while
循环时,就值得考虑它将执行多少次的选项。)