2014-04-14 33 views
0
檢索值

我正在一個錯誤:我得到「沒有行位置0」,而我嘗試從SQL

System.IndexOutOfRangeException: No rows at position 0.

從這一行:

string value = dt.Rows[0]["Project"].ToString(); 

全部事件:

protected void RadDropDownList1_SelectedIndexChanged(object sender, DropDownListEventArgs e) 
{ 
    RadDropDownList droplist = sender as RadDropDownList; 
    GridDataItem item = droplist.NamingContainer as GridDataItem; 
    DataTable dt = GetDataTable("SELECT Project FROM Pnum WHERE Project='"+ droplist.SelectedItem.Text +"'"); 
    string value = dt.Rows[0]["Project"].ToString(); 
    item["Project"].Text = value; 
} 

public DataTable GetDataTable(string query) 
{ 
    SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["WTAConnectionString"].ConnectionString); 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand(query, conn); 
    DataTable dt = new DataTable(); 
    dt.Load(cmd.ExecuteReader()); 
    return dt; 
} 

我做了一些調試,droplist.SelectedItem.Text的值是正確的,我檢查了表中的值,並有可用的值。我應該尋找什麼?

+2

[SQL注入警報(http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - 你應該** **不串連在一起您的SQL語句 - 使用**參數化查詢**來代替以避免SQL注入 –

+0

您必須在退出方法'GetDataTable'之前關閉連接。 –

+0

@mason謝謝,你的提示幫助我解決了這個問題。請將它作爲答案發布,我會接受它。 – Nullbyte

回答

1

如果查詢返回任何結果,則會有行。通過直接針對數據庫運行查詢來驗證您的查詢是否返回結果。使用Visual Studio調試工具來獲取查詢(不要只鍵入它),因爲查詢可能不如您預期的那樣。

+0

謝謝梅森。問題在於你的假設。 – Nullbyte

1

這意味着您的查詢沒有返回任何結果。把一個斷點在這一行:

string value = dt.Rows[0]["Project"].ToString(); 

,並在調試器,使用數據表Visualizer來看看dt值。它將是空的。

檢查你從droplist.SelectedItem.Text得到什麼值,它可能不是你想要的。另外,您應該使用SQL參數來避免注入。

1

檢查datatable是否有任何行。

DataTable dt = GetDataTable("SELECT Project FROM Pnum WHERE Project='"+ droplist.SelectedItem.Text +"'"); 

if(dt!=null && dt.Rows.Count>0) 
{  
string value = dt.Rows[0]["Project"].ToString(); 
item["Project"].Text = value; 
}