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,这导致我的程序给我这个错误:
未能启用约束。一个或多个行包含违反非空、唯一或外键约束的值。
谁知道可能是什么原因,请帮助我。
每次加载一行时都向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);
}