1

请帮忙!

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

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

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

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

4

4 回答 4

4

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

于 2013-05-17T15:15:53.750 回答
3

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

仅当有记录时,您还应该从读取器加载表。您还应该使用以下using语句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()显示什么?ADataTable是一个没有自定义的复杂对象ToString

于 2013-05-17T15:22:32.257 回答
1

你把它弄反了。您似乎认为您收到该错误消息是因为您的 SqlDataReader 为空。这是相反的方式。您的 SqlDataReader 仍然为空,因为您正在运行的 sql 产生了该错误。在任何东西可以分配给您的阅读器变量之前,这会导致异常。

您需要调试 search_person 存储过程。

于 2013-05-17T15:20:15.697 回答
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);
      }
于 2013-05-17T15:17:08.463 回答