日期:2014-05-18  浏览次数:21197 次

"未能启用约束,一行或多行中包含违反非空,唯一或者外键约束的值 "报表中查询视图时出错
"未能启用约束,一行或多行中包含违反非空,唯一或者外键约束的值 "报表中查询视图时出错
C# code

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字段相等选出来的



------解决方案--------------------
因为视图没有主键,而sda.Fill的时候会默认一个字段为主键,导致主键取值重复而失败,
------解决方案--------------------
你就把主表的主键取出来啊,至于用不用都无所谓的
------解决方案--------------------
探讨
但是我那个表中没有主键

引用:

你就把主表的主键取出来啊,至于用不用都无所谓的

------解决方案--------------------
探讨

但是我那个表中没有主键引用:

你就把主表的主键取出来啊,至于用不用都无所谓的

------解决方案--------------------
C# code
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;

------解决方案--------------------
while (reader.Read())
{
DataRow drw = dtbl.NewRow();
for (int i = 0; i < count; i++)
{
drw[i] = reader[i];
}
dtbl.Rows.Add(drw);
}
疏忽了,忘了这句,补上就好
------解决方案--------------------
你就把视图当表一样使用就可以了
select * from vw where a=@a and b=@b
或者
select * from vw where a=‘111’ and b=‘222’