SqlDataReader returns null

本文关键字:null returns SqlDataReader | 更新日期: 2023-09-27 18:14:19

请帮忙!

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

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

未能启用约束。一个或多个行包含违反非空、唯一或外键约束的值。

谁知道可能是什么原因,请帮助我。

SqlDataReader returns null

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

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

只有在有记录的情况下才应该从读取器加载表。您还应该对SqlDataRader使用using语句:

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);
}

Btw, table.ToString()应该显示什么?DataTable是一个没有自定义ToString的复杂对象。

你搞反了。您似乎认为得到该错误消息是因为SqlDataReader为空。这是反过来的。您的SqlDataReader仍然为空,因为您正在运行的sql产生了该错误。这将导致一个异常,在任何东西可以分配给你的reader变量。

您需要调试search_person存储过程

正如我们所看到的,您正在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);
      }