SqlDataReader返回null

时间:2013-05-17 15:09:05

标签: c# ado.net datatable sqldatareader

请帮忙!

我有一个程序,它使用存储过程从数据库中检索数据并将数据转储到表中以供显示,这就是我的代码的外观:

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,导致我的程序给我这个错误:

  

无法启用约束。一行或多行包含违反非null,唯一或外键约束的值。

任何知道可能是什么原因的人都可以帮助我。

4 个答案:

答案 0 :(得分:4)

每次加载行时,都会向DataTable添加相同的四列。

答案 1 :(得分:3)

如果你想填充数据表,我更希望SqlDataAdapter.Fill(table)。 为什么在循环中添加DataColumns?这将多次添加列。您根本不需要手动添加列。这两种方法都会自动从架构中创建列。

只有存在记录时,您还应该从阅读器加载表格。您还应该使用using的{​​{1}}语句:

SqlDataRader

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()是一个复杂的对象,没有自定义DataTable

答案 2 :(得分:1)

你已经倒退了。您似乎认为您收到该错误消息,因为您的SqlDataReader为null。这是相反的方式。您的SqlDataReader仍然为null,因为您运行的sql产生了该错误。在将任何内容分配给读者变量之前,这会导致异常。

您需要调试search_person存储过程。

答案 3 :(得分: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);
      }