2011-12-21 54 views
0

我正在ASP.NET中開發此網站並使用C#。我得到的錯誤是:使用未分配的變量usn。數據庫也不是空的。 我的代碼是:「使用未分配的變量」錯誤

protected void Button1_Click(object sender, EventArgs e) 
{ 

    SqlConnection cn = new SqlConnection(); 
    SqlCommand cm = new SqlCommand(); 
    SqlDataReader dr; 
    cn.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Vijaylaxmi\Desktop\TrainReserveold\App_Data\Database.mdf;Integrated Security=True;User Instance=True"; 
    cn.Open(); 
    cm.Connection = cn; 
    String usn; 
    cm.CommandText = "Select UserName from User where UserName='" + TextBox1.Text + "'"; 
    dr = cm.ExecuteReader(); 
    while (dr.Read()) 
    { 
     usn = dr.GetString(0); 
    } 
    if (String.Compare(usn, TextBox1.Text) != 0) 
    { 
     Response.Write("Invalid user name... try again"); 
     TextBox1.Text = ""; 
     TextBox2.Text = ""; 
     TextBox1.Focus(); 
    } 
    Response.Write("user valid now"); 
} 
+3

你應該在'using'語句中創建'SqlConnection','SqlCommand'和'SqlDataReader'。 – Oded

+2

現在你正在粗魯。儘快地?你知道,我沒有爲此付出代價。這只是讓我失去了回答所有的興趣。 – Oded

+0

我也會考慮重寫你創建連接和命令的方式我會發佈一個例子,它會讓你更容易地遵循你可能導致你自己的困惑 – MethodMan

回答

1

assing美國海軍串起來頂部,

string usn = string.empty; then go from there 
//create a Stored Procedure and put your Select Statement in there.. to avoid Sql Injection 
cmd.CommandText = "name of your stored proc"; 
cmd.CommandType = System.Data.CommandType.StoredProcedure; 

我也從一個web.config或app.config中根據應用的類型,閱讀我的SQL字符串接法你正在跑步。

+1

分配NULL可能會更好,因爲空的用戶名可能無效,即使DB中沒有其他用戶存在。 –

+0

Empty只是一個初始化器,我會真正推薦他重構他的連接,使用類似這樣的東西,然後在使用內部創建/分配他的命令對象(SqlConnection sqlConnSqlConnection = new SqlConnection(strConnectionString)){} – MethodMan

+0

所有的代碼都很糟糕。但我想羅馬不是一天建成的。沒有理由引入更多的錯誤:) –

0

改變你的cm.CommandText =「選擇用戶名從用戶其中username = 到我在這裏看到

cm.CommandText = string.Format("Select UserName from User where UserName= '{0}'",Textbox1.Text); 
+1

這不會阻止SQL注入 –

+0

是的,他可以隨時更改,以提供存儲過程中的sql命令..我知道,但好點.. – MethodMan

+0

存儲過程不會阻止注入。命令參數做。 –

3

幾個問題在你的問題具體的迴應,要更換此:

dr = cm.ExecuteReader(); 
while(dr.Read()) 
{ 
    usn = dr.GetString(0); 
} 

與此:

usn = cm.ExecuteScalar().ToString(); 

請務必檢查DBNul首先,以防萬一。

更一般地,要
一)參數化的SQL(或更好,使用存儲過程),而不是使用原始輸入。這將保護您免受SQL注入攻擊。
b)不要在代碼中直接包含連接字符串。把它放在配置文件中。絕大部分肯定不會在互聯網上發佈。