检查数据读取器是否有行?

时间:2014-11-25 16:04:33

标签: c# database-connection datareader

我找到了很多答案,但似乎没有解决我的问题。

用户单击“新建”按钮开始添加新客户记录。存储过程返回CustID的最大值,然后递增并分配给txtCustID文本框。只要客户数据库中有记录,这就完美无缺。

但要创建第一个记录,这显然不起作用,因为你不能增加任何东西。

我需要做的是查看数据阅读器是否有任何内容,如果不是,我需要将txtCustID设置为“1”,否则正常运行现有代码。

这是我最近的尝试:

protected void btnNew_Click(object sender, EventArgs e)
{
    Clear();
    SqlCommand command = conn.CreateCommand();
    SqlDataReader reader;
    try
    {
        command.CommandText = "GetMax";
        command.CommandType = CommandType.StoredProcedure;
        conn.Open();
        reader = command.ExecuteReader();
        if (reader.HasRows)
        {
            while (reader.HasRows)
            {
                while (reader.Read())
                {
                    int CustMax = reader.GetInt32(0);
                    CustMax++;
                    txtCustID.Text = CustMax.ToString();
                }
                reader.NextResult();
            }
        }
        else
        {
            txtCustID.Text = "1";
        }
        reader.Dispose();
    }
    catch (SqlException)
    {
        lblMessage.Text = "Cannot connect to database";
    }
    catch (Exception ex)
    {
        lblMessage.Text = ex.Message;
    }
    finally
    {
        command.Dispose();
        conn.Dispose();
    }
}

这是我的存储过程:

USE [30004243]
GO
/****** Object:  StoredProcedure [dbo].[GetMax]    Script Date: 26/11/2014 2:29:28 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetMax]
AS
SELECT MAX(CustID)
FROM Customer

这是设置为我的lblMessage标签的错误:“数据为空。无法在Null值上调用此方法或属性。”

虽然用户可以直接看到该消息并手动输入“1”到txtCustID(工作正常),但为了实用性,它应该将其设置为1。

非常感谢所有帮助,我也会在上一个问题中提出后添加,我正在使用.net 4.5。

3 个答案:

答案 0 :(得分:0)

在这里发表评论/答案并在其他地方找到,我用执行标量替换了读者。这是有效的。

        protected void btnNew_Click(object sender, EventArgs e)
    {
        Clear();
        SqlCommand command = conn.CreateCommand();
        try
        {
            command.CommandText = "GetMax";
            command.CommandType = CommandType.StoredProcedure;
            conn.Open();

            object cMax = command.ExecuteScalar();
            if (cMax != DBNull.Value)
            {
                int CustMax = (int)cMax;
                CustMax++;
                txtCustID.Text = CustMax.ToString();
            }
            else
            {
                txtCustID.Text = "1";
            }

        }
        catch (SqlException)
        {
            lblMessage.Text = "Cannot connect to database";
        }
        catch (Exception ex)
        {
            lblMessage.Text = ex.Message;
        }
        finally
        {
            command.Dispose();
            conn.Dispose();
        }
    }

答案 1 :(得分:-2)

我通常会检查读者是否为空。

示例:

if(reader != DNNull.value){


}else{
    txtCustID.Text = "1";
}

答案 2 :(得分:-2)

这不是添加新记录的正确方法。但是,回答你的问题是:

if (reader.HasRows == false)
{
    txtCustID.Text = "1";
}
编辑:你可以这样做,这很简单:

        while (dr.Read())
        {
            if (dr.HasRows)
            {
                //Do things, insert, update
            }
            else
            {

            }
        }
相关问题