请帮忙!
我有一个程序,它使用存储过程从数据库中检索数据并将数据转储到表中以供显示,这就是我的代码的外观:
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,唯一或外键约束的值。
任何知道可能是什么原因的人都可以帮助我。
答案 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);
}