"未能启用约束,一行或多行中包含违反非空,唯一或者外键约束的值 "报表中查询视图时出错using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;namespace MZYSZ
{
    public partial class FormSrytalreport : Form
    {
        public FormSrytalreport()
        {
            InitializeComponent();
        }        private void FormSrytalreport_Load(object sender, EventArgs e)
        {
            try
            {
                //string st = SQL.getCon();
                SqlConnection con = new SqlConnection(SQL.getCon());
                //string sql = "select * from patient_information";
                string sql = "select * from patient_cf";
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter(sql, con);
                //DataSet ds = new DataSet();
                //CfDataSet cds = new CfDataSet();
                //PatientDataSet1 cds = new PatientDataSet1();
                CfpatientDataSet1 cds = new CfpatientDataSet1();
                sda.Fill(cds, "patient_cf");
                //sda.Fill(cds, "patient_information");
                CrystalReport1 crr = new CrystalReport1();
                //crr.SetDataSource(cds.Tables["patient_information"]);
                crr.SetDataSource(cds.Tables["patient_cf"]);
                this.crystalReportViewer1.ReportSource = crr;            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}我查询表patient_information的时候可以查出数据,但是查视图时patient_cf提示出错。视图patient_cf是表patient_information和表patient 通过p_id字段相等选出来的

解决方案 »

  1.   

    因为视图没有主键,而sda.Fill的时候会默认一个字段为主键,导致主键取值重复而失败,
      

  2.   

    可以使用 SqlDataReader 读取数据啊,另外 CfpatientDataSet1 是什么
      

  3.   

    如果你想利用SqlDataAdapter和dataset,那么就给表添加一个自动增长列。另外,创建的表没有主键是很难想象的。
      

  4.   

    怎么用SqlDataReader 写代码实现呢,CfpatientDataSet1 是我建立的一个DataSet
      

  5.   

    SqlConnection con = new SqlConnection(SQL.getCon());
    //string sql = "select * from patient_information";
    string sql = "select * from patient_cf";
    con.Open();
    SqlCommand cmd = new SqlCommand(sql, con);
    SqlDataReader reader = cmd.ExecuteReader();
    DataTable dtbl = new DataTable();
    // 这个位置添加 DataTable 列,和数据库视图中列名和列数量一致
    // dtbl.Columns.Add(...);
    // dtbl.Columns.Add(...);
    // ......
    int count = reader.FieldCount;
    while (reader.Read())
    {
        DataRow drw = dtbl.NewRow();
        for (int i = 0; i < count; i++)
        {
            drw[i] = reader[i];
        }
    }
    reader.Dispose();
    cmd.Dispose();
    con.Dispose();
    CrystalReport1 crr = new CrystalReport1();
    crr.SetDataSource(dtbl);
    this.crystalReportViewer1.ReportSource = crr;
      

  6.   

    while (reader.Read())
    {
        DataRow drw = dtbl.NewRow();
        for (int i = 0; i < count; i++)
        {
            drw[i] = reader[i];
        }
        dtbl.Rows.Add(drw);
    }
    疏忽了,忘了这句,补上就好
      

  7.   

    非常感谢,可以运行成功了!我想在想设置视图patient_cf里的字段a和字段b为传入参数,怎么写代码实现呢?
      

  8.   

    你就把视图当表一样使用就可以了
    select * from vw where a=@a and b=@b
    或者
    select * from vw where a=‘111’ and b=‘222’