本帖最后由 chuang2871 于 2011-02-20 20:33:27 编辑

解决方案 »

  1.   

    虽然数据库中没有满足查询条件的数据,但DataSet还是会有其他数据的,比如:列名  你可以查看ds1.Tables[0].Columns中的值,它是有列的,所有ds1不是null
    如果要想达到判断效果的话  就用ds1.Tables[0].Rows.Count 判断
      

  2.   

    isnull(sum(j_count),0)
    SUM 函数返回数值列的总数,没值就是NULL
      

  3.   

    getdatafromdb()方法中已经用了你说的方法 
    这里提示找不到Tables[0]错误 
    下面是我做的数据库连接类,是不是不太严谨?总提示这里有错误using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;using System.Windows.Forms;using System.Data.OleDb;namespace 长峻油库管理系统
    {
        public class db_conn
        {
            public OleDbConnection conn = new OleDbConnection();        //完成数据库连接的构造函数
            public db_conn()
            {
                conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "\\yk.mdb";
                conn.Open();
            }
            //数据查询的方法
            public System.Data.DataSet getdatafromdb(string str1)
            {
                DataSet ds = new DataSet();
                OleDbDataAdapter dap1 = new OleDbDataAdapter(str1, conn);
                try
                {
                    dap1.Fill(ds);
                }
                catch { }
                if (ds.Tables[0].Rows.Count > 0)
                    return ds;
                else
                    return null;
               
            }
            //数据插入、删除、修改操作的方法
            public bool updatedatabase(string str1)
            {
                try
                {
                    OleDbCommand cmd = new OleDbCommand(str1, conn);
                    cmd.ExecuteNonQuery();
                    // MessageBox.Show("数据操作成功!","系统提示");
                }
                catch (Exception e)
                {
                    MessageBox.Show("数据插入错误!" + e.ToString(), "系统提示");
                    return false;
                }
                return true;
            }
        }
    }
      

  4.   


    确实很不严谨首先,使用过的数据连接应该马上释放;其次,对异常的判断也不太严格。我将你的代码改为:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Windows.Forms;
    using System.Data.OleDb;namespace 长峻油库管理系统
    {
        public class db_conn
        {
            public OleDbConnection conn = new OleDbConnection();        //完成数据库连接的构造函数 
            public db_conn()
            {
                conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "\\yk.mdb";
                //不需要conn.Open(),在需要的时候打开,使用完毕后马上关闭,给你注释掉了
                //conn.Open();
            }
            //数据查询的方法 
            public DataSet getdatafromdb(string str1)
            {
                DataSet ds = new DataSet();
                //使用using子句进行数据访问,以保证数据连接在使用完毕后能彻底关闭
                try
                {
                    using (OleDbDataAdapter dap1 = new OleDbDataAdapter(str1, conn))
                    {
                        //将数据填充到DataSet中
                        dap1.Fill(ds, "temptable");
                        //到这里,数据库会自动关闭
                    }
                    if (ds.Tables["temptable"].Rows.Count > 0)
                        return ds;
                    else
                        return null;
                }
                catch
                {
                    //如果获取数据失败,那么提示错误。这里和finally使用conn.Close(),虽然using能保证释放连接,但加上这个不是什么坏事,防止程序意外终止无法释放连接的情况
                    conn.Close();
                    MessageBox.Show("读取数据失败!");
                    return null;
                }
                finally
                {
                    conn.Close();
                }        }
            //数据插入、删除、修改操作的方法 
            public bool updatedatabase(string str1)
            {
                int i = 0;
                try
                {
                    using (OleDbCommand cmd = new OleDbCommand(str1, conn))
                    {
                        conn.Open();
                        i=cmd.ExecuteNonQuery();
                        // MessageBox.Show("数据操作成功!","系统提示"); 
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show("数据插入错误!" + e.Message+ "系统提示");
                    return false;
                }
                //不建议使用异常来控制返回值的情况,最后还是要判断一下的好。如果没有更新到数据库而程序有没有返回异常就会出错。变量i表示更新语句影响的数据库行数,建议用此方法判断。
                if (i > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }
      

  5.   

    我测试全过程:
    1,新建winform项目,在空白窗体上拖一个textbox供输入sql检索字符串,一个button来执行检索数据事件,一个DataGridView来显示提取的数据:
    form1.cs的button1_Click事件代码:        private void button1_Click(object sender, EventArgs e)
            {
                DataSet ds = new DataSet();
                ds = dbconn.getdatafromdb(textBox1.Text);
                if (ds != null)
                {
                    dataGridView1.DataSource = ds.Tables[0];
                    dataGridView1.AutoGenerateColumns = true;
                }
                else
                {
                    MessageBox.Show("未能取出任何数据,请检查SQL检索语句是否正确?","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
                    textBox1.Focus();
                }
            }
    2,右键VS解决方案资源管理器自己的项目,选择“添加-->类”,我输入的类名为“dbconn.cs”,在该类中输入代码(我用我的SQL数据库测试的,改了连接字符串等信息,请注意):using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;namespace TreeView
    {
        class dbconn
        {
            private static string connstr = "data source=127.1; initial catalog=stlivead;user id=sa;password=sa;";         //数据查询的方法 
            public static DataSet getdatafromdb(string str1) 
            { 
                DataSet ds = new DataSet(); 
                //使用using子句进行数据访问,以保证数据连接在使用完毕后能彻底关闭 
                try 
                {
                    using (SqlConnection conn = new SqlConnection(connstr))
                    {
                        using (SqlDataAdapter da = new SqlDataAdapter(str1, conn))
                        {
                            //将数据填充到DataSet中 
                            da.Fill(ds, "temptable");
                            //到这里,数据库会自动关闭 
                        }
                    }
                    if (ds.Tables["temptable"].Rows.Count > 0) 
                        return ds; 
                    else 
                        return null; 
                } 
                catch 
                { 
                    //如果获取数据失败,那么提示错误。这里和finally使用conn.Close(),虽然using能保证释放连接,但加上这个不是什么坏事,防止程序意外终止无法释放连接的情况 
                    return null; 
                } 
            } 
            //数据插入、删除、修改操作的方法 
            public bool updatedatabase(string str1) 
            { 
                int i = 0; 
                try
                {
                    using (SqlConnection conn = new SqlConnection(connstr))
                    {
                        using (SqlCommand cmd = new SqlCommand(str1, conn))
                        {
                            conn.Open();
                            i = cmd.ExecuteNonQuery();
                            // MessageBox.Show("数据操作成功!","系统提示"); 
                        }
                    }
                } 
                catch
                { 
                    return false; 
                } 
                //不建议使用异常来控制返回值的情况,最后还是要判断一下的好。如果没有更新到数据库而程序有没有返回异常就会出错。变量i表示更新语句影响的数据库行数,建议用此方法判断。 
                if (i > 0) 
                { 
                    return true; 
                } 
                else 
                { 
                    return false; 
                } 
            } 
        } 

      

  6.   

    恩 你的类没问题 我已经在使用了
    但是没解决用sum求和时 假如数据库中不存在这段时间的数据结果集不为空的问题
      

  7.   


    不太明白你的意思,你是说在某段时间内对应的字段为null值?
      

  8.   

    不好意思 我表达能力差  
    就是我的查询语句 是select sum(count) from table where date between  date1 and date2 
    而在我的数据库中没有在 date1 和 date2之间的数据
    那么按常理来说 返回的值不应该是null吗?
    可我在判断的时候是 这样的
    if(ds1==null)
       MessageBox.Show("1");
    而这个条件语句没有执行 我搞不懂为什么
      

  9.   

    判断DataSet是否为空不能用ds==null
    可以用下面方法:
                if (ds.Tables[0].Rows.Count > 0) 
                    return ds; 
                else 
                    return null
      

  10.   

    完善了一下程序,附运行截图和源码,希望对你有所帮助当输入错误的sql检索数据时,其实和你检索不到数据是一样的
    主程序2个TextBox和2个Buttonusing System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace TreeView
    {
        public partial class getdata : Form
        {
            public getdata()
            {
                InitializeComponent();
            }        DataSet ds = new DataSet();
            private void button1_Click(object sender, EventArgs e)
            {
                dataGridView1.DataSource = null;
                ds = dbconn.getdatafromdb(textBox1.Text);
                if (ds != null)
                {
                    dataGridView1.DataSource = ds.Tables[0];
                    dataGridView1.AutoGenerateColumns = true;
                }
                else
                {
                    MessageBox.Show("未能取出任何数据,请检查SQL检索语句是否正确?", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBox1.Focus();
                }
            }        private void button2_Click(object sender, EventArgs e)
            {
                int isupdteok=0;
                isupdteok= dbconn.updatedatabase(textBox2.Text);
                if (isupdteok ==0)
                {
                    MessageBox.Show("更新失败!");
                }
                else
                {
                    MessageBox.Show("更新成功!\n\n此更新影响数据行数为:"+isupdteok.ToString());
                    button1_Click(sender,e);
                }
            }
        }
    }dbconn.cs类using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;namespace TreeView
    {
        class dbconn
        {
            private static string connstr = "data source=127.1; initial catalog=stlivead;user id=sa;password=sa;";         //数据查询的方法 
            public static DataSet getdatafromdb(string str1) 
            { 
                DataSet ds = new DataSet(); 
                //使用using子句进行数据访问,以保证数据连接在使用完毕后能彻底关闭 
                try 
                {
                    using (SqlConnection conn = new SqlConnection(connstr))
                    {
                        using (SqlDataAdapter da = new SqlDataAdapter(str1, conn))
                        {
                            //将数据填充到DataSet中 
                            da.Fill(ds, "temptable");
                            //到这里,数据库会自动关闭 
                        }
                    }
                    //改行代码判断ds是否有数据,有返回ds,无返回null
                    if (ds.Tables["temptable"].Rows.Count > 0) 
                        return ds; 
                    else 
                        return null; 
                } 
                catch 
                { 
                    //如果获取数据失败,那么提示错误。这里和finally使用conn.Close(),虽然using能保证释放连接,但加上这个不是什么坏事,防止程序意外终止无法释放连接的情况 
                    return null; 
                } 
            } 
            //数据插入、删除、修改操作的方法 
            public static int updatedatabase(string str1) 
            { 
                int i = 0; 
                try
                {
                    using (SqlConnection conn = new SqlConnection(connstr))
                    {
                        using (SqlCommand cmd = new SqlCommand(str1, conn))
                        {
                            conn.Open();
                            i = cmd.ExecuteNonQuery();
                            // MessageBox.Show("数据操作成功!","系统提示"); 
                        }
                    }
                    return i;
                } 
                catch
                { 
                    return i; 
                } 
            } 
        } 

      

  11.   

    我是这样判断的:if (ds.Tables[0].Rows.Count == 0)
    {  
    }