检查数据读取器是否有行
本文关键字:是否 数据 读取 检查 | 更新日期: 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
{
}
}