2013-05-17 66 views
1

請幫忙!SqlDataReader返回null

我有一個使用存儲過程從數據庫中檢索數據並顯示一個錶轉儲數據的程序,這是我的代碼的外觀:

string connectionString = ConfigurationManager.ConnectionStrings["azcom"].ConnectionString; 

    using (SqlConnection conn = new SqlConnection(connectionString)) 
    { 
     conn.Open(); 
     cmd = new SqlCommand("search_person", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add("@searchString", SqlDbType.VarChar).Value = searchString; 


     SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

       DataTable table = new DataTable(); 
       while (reader.Read()) 
       { 
        table.Columns.Add("IDNumber", typeof(string)); 
        table.Columns.Add("Name", typeof(string)); 
        table.Columns.Add("Surname", typeof(string)); 
        table.Columns.Add("Company Name", typeof(string)); 

        table.Rows.Add("@idnumber", "@name", "@surname", "@companyN"); 
       } 
       table.Load(reader); 
       lblDisplay.Text = table.ToString(); } 

問題是我的SqlDataReader對象返回null導致我的程序給我這個錯誤:

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

任何人有一個想法可能是什麼原因請幫助我。

+3

如果你想填充一個datatable無論如何,我更喜歡'SqlDataAdapter.Fill(table)'。順便說一句,什麼'table.ToString()'顯示?一個'DataTable'是一個沒有自定義'ToString'的複雜對象。 –

+0

我們需要在枚舉讀取器之前**設置**'DataTable'和它的列** **然後您需要實際去**通過使用'string獲取讀值的值** name = reader.GetString(1)'等等...... –

+1

爲什麼在循環中添加'DataColumns'?在執行讀者之前,你應該這樣做一次。 –

回答

4

每次加載一行時,都會向DataTable添加相同的四列。

+3

這是真的,但這不是他(當前)錯誤的原因。代碼從來沒有達到那麼遠。 –

+0

@JoelCoehoorn你是對的(根據你的回答)。將相同列添加到「DataTable」將產生錯誤「名爲'IDNumber'的列已屬於此DataTable.'。我同意這可能是sproc的錯誤 - +1爲你的答案。 –

+0

實際上,我有SEEN c#SQL語句,其中在執行cmd.ExecuteNonQuery之後的代碼會導致錯誤在運行之前被拋出?我認爲在Execute語句中必須有一個檢查器在代碼塊上運行,並且可以在此處引發錯誤。 這不一定是OP的問題,但鑽石是正確的,這是他們應該修復的問題 – JPK

0

正如我們所看到的,您正在while()循環內添加列;相同的列名正在循環內添加。
另一個錯誤是,你是不是在正確的方式將在DataTable行:

只需更新這樣的代碼和相應的更換你的專欄:

DataTable table = new DataTable(); 
table.Columns.Add("IDNumber", typeof(string)); 
table.Columns.Add("Name", typeof(string)) 
table.Columns.Add("Surname", typeof(string)); 
table.Columns.Add("Company Name", typeof(string)); 
    while (reader.Read()) 
     { 
     DataRow dr=table.NewRow();     
     dr["IDNumber"]=reader["IDNumber"]; 
     dr["Name"]=reader["Name"]; 
     dr["Surname"]=reader["Surname"]; 
     dr["Company Name"]=reader["Company_Name"]; 
     table.Rows.Add(dr); 
     } 
1

你明白了倒退。你似乎認爲你得到那個錯誤信息是因爲你的SqlDataReader爲空。這是相反的方式。您的SqlDataReader仍爲空,因爲您正在運行的SQL產生了該錯誤。在任何事情可能被分配給你的reader變量之前,這導致了一個異常。

您需要調試search_person存儲過程。

3

如果你想填寫一個datatable無論如何,我寧願SqlDataAdapter.Fill(table)。 爲什麼在循環中添加DataColumns?這將多次添加列。根本不需要手動添加列。這兩種方法都會自動創建架構中的列。

只有在有記錄的情況下,您還應該從閱讀器載入表格。而且你還要使用的SqlDataRaderusing聲明:

DataTable table = new DataTable(); 
using(var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
{ 
    table.Load(reader); 
} 
lblDisplay.Text = table.Rows.Count.ToString(); 

SqlDataAdapter方法:

DataTable table = new DataTable(); 
// you don't need to add the columns 
using(var da = new SqlDataAdapter(cmd)) 
{ 
    // you don't need to open/close the connection with the adapter 
    da.Fill(table); 
} 

順便說一句,我應該table.ToString()顯示? A DataTable是一個複雜的對象,沒有自定義ToString

+0

我想要顯示錶格數據,我如何在網絡表單上顯示它? –

+0

您可以使用'DataTable'作爲'DataSource'作爲'GridView'或其他數據綁定webcontrol(如'Repeater','ListView'或'DataList'),或者 - 如果它只是一個列 - 用於ListBox或'DropDownList'(設置'DatTextField'和'DataValueField')。網絡中有很多教程。 –