检查数据读取器是否有行

本文关键字:是否 数据 读取 检查 | 更新日期: 2023-09-27 18:32:00

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

用户单击"新建"按钮开始添加新的客户记录。存储过程返回 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 值调用此方法或属性。

虽然用户可以简单地看到该消息并在txtCustID(工作正常)中手动输入"1",但为了可用性,它应该将其设置为1。

非常感谢所有帮助,在上一个问题中被问到后,我也会补充一点,我正在使用.net 4.5。

检查数据读取器是否有行

根据此处和其他地方的评论/答案,我将读者替换为执行标量。这是有效的方法。

        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();
        }
    }

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

例:

if(reader != DNNull.value){

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

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

if (reader.HasRows == false)
{
    txtCustID.Text = "1";
}

编辑:你可以这样做,这真的很简单:

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