数据集返回ZERO结果

时间:2009-05-27 18:49:51

标签: c# sql winforms debugging data-access-layer

我正在尝试从数据库中填写我的winform应用程序中的组合框。我知道数据库中有信息。我知道SP有效。它返回正确的ColumnNames。但DataSet本身是空的?帮助!?!?

从我的表单中调用 - >

cboDiagnosisDescription.Properties.DataSource = myDiagnosis.RetrieveDiagnosisCodes();

RetrieveDiagnosisCodes - >

public DataSet RetrieveDiagnosisCodes()
    {
        string tableName = "tblDiagnosisCues";
        string strSQL = null;
        DataSet ds = new DataSet(tableName);
        SqlConnection cnn = new SqlConnection(Settings.Default.CMOSQLConn);
        //strSQL = "select * from " & tableName & " where effectivedate <= getdate() and (termdate >= getdate() or termdate is null)"
        strSQL = "select tblDiagnosisCues.*, tblDiagnosisCategory.Description as CategoryDesc, tblDiagnosisSubCategory.Description as SubCategoryDesc " + "FROM dbo.tblDiagnosisCategory INNER JOIN " + "dbo.tblDiagnosisSubCategory ON dbo.tblDiagnosisCategory.Category = dbo.tblDiagnosisSubCategory.Category INNER JOIN " + "dbo.tblDiagnosisCues ON dbo.tblDiagnosisSubCategory.SubCategory = dbo.tblDiagnosisCues.SubCategoryID " + "where effectivedate <= getdate() and (termdate >= getdate() or termdate is null) order by tblDiagnosisCues.Description";
        SqlCommand cmd = new SqlCommand(strSQL, cnn) {CommandType = CommandType.Text};
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        try
        {
            //cnn.Open();
            da.Fill(ds);
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            cmd.Dispose();
            da.Dispose();
            //ds.Dispose();
            cnn.Close();
            cnn.Dispose();
        }
        return ds;
    }

我知道它返回正确的列名称的原因是我在DevExpress LookUpEdit框中尝试了以下内容,并且它从数据库中填充了正确的列 - &gt;

            var myDiagnosis = new Diagnosis();
        var ds = myDiagnosis.RetrieveDiagnosisCodes();
        lkuDiagnosis.Properties.DataSource = ds;
        lkuDiagnosis.Properties.PopulateColumns();
        lkuDiagnosis.Properties.DisplayMember = ds.Tables[0].Columns[1].ColumnName;
        lkuDiagnosis.Properties.ValueMember = ds.Tables[0].Columns[0].ColumnName;

想法?主要是,我甚至不知道如何继续跟踪它...如何调试它?

编辑1

根据评论我自己运行了以下SQL,它返回了650个结果......

select tblDiagnosisCues.*, 
    tblDiagnosisCategory.Description as CategoryDesc,   
    tblDiagnosisSubCategory.Description as SubCategoryDesc 
FROM dbo.tblDiagnosisCategory 
    INNER JOIN dbo.tblDiagnosisSubCategory 
    ON dbo.tblDiagnosisCategory.Category = dbo.tblDiagnosisSubCategory.Category 
        INNER JOIN dbo.tblDiagnosisCues ON dbo.tblDiagnosisSubCategory.SubCategory = dbo.tblDiagnosisCues.SubCategoryID 
where effectivedate <= getdate() and (termdate >= getdate() or termdate is null) order by tblDiagnosisCues.Description

2 个答案:

答案 0 :(得分:4)

// cnn.open();

...

// ds.dispose();

无需在数据集构造函数中指定表名。 fill方法将添加一个表。也不需要打开连接,因为sqldataadapter将为您打开和关闭连接。另外,我更喜欢返回一个数据表,而不是带有一个表的数据集。

代码可以重构为以下内容...如果要记录异常,请添加try catch。

public DataTable RetrieveDiagnosisCodes()
{
    //string tableName = "tblDiagnosisCues";
    DataSet ds = new DataSet();
    Datatable dt = null;
    //strSQL = "select * from " & tableName & " where effectivedate <= getdate() and (termdate >= getdate() or termdate is null)"
    string strSQL = "select tblDiagnosisCues.*, tblDiagnosisCategory.Description as CategoryDesc, tblDiagnosisSubCategory.Description as SubCategoryDesc " + "FROM dbo.tblDiagnosisCategory INNER JOIN " + "dbo.tblDiagnosisSubCategory ON dbo.tblDiagnosisCategory.Category = dbo.tblDiagnosisSubCategory.Category INNER JOIN " + "dbo.tblDiagnosisCues ON dbo.tblDiagnosisSubCategory.SubCategory = dbo.tblDiagnosisCues.SubCategoryID " + "where effectivedate <= getdate() and (termdate >= getdate() or termdate is null) order by tblDiagnosisCues.Description";

    using(SqlDataAdapter da = new SqlDataAdapter(strSQL, Settings.Default.CMOSQLConn))
    {
      da.Fill(ds);
    }
    if (ds.Tables.Count > 0)
    {
      dt = ds.Tables[0];
    }

    return dt;
}

答案 1 :(得分:0)

如果数据正确绑定到另一个控件,则表示数据绑定过程存在问题。对于有问题的组合框,您的数据绑定设置是什么样的?是否正确拼写并设置了所有列名称?