【发布时间】:2017-07-17 15:08:04
【问题描述】:
我想找到一种在 if 语句之后退出 datareader 的方法,以便我可以在 else 语句中执行插入查询。有办法吗?
我收到 dr 仍处于打开状态的错误,因此无法执行以下查询。
sVendorDetails.VendorID = insertcmd.ExecuteNonQuery();
代码如下:
public class VendorDetails
{
int _VendorID;
string _VendorName;
public int VendorID
{
set { _VendorID = value; }
get { return _VendorID; }
}
public string VendorName
{
set { _VendorName = value; }
get { return _VendorName; }
}
}
public VendorDetails VendorCheck(string sVendorName)
{
SqlCommand cmd = new SqlCommand("dbo.usp_GetVendorByVendorName", myConnection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@VendorName", SqlDbType.VarChar));
cmd.Parameters["@VendorName"].Value = sVendorName;
VendorDetails sVendorDetails = null;
try
{
myConnection.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())
{
sVendorDetails = new VendorDetails();
sVendorDetails.VendorID = ((int)dr["VendorID"]);
sVendorDetails.VendorName = ((string)dr["VendorName"]).ToUpper().Trim();
}
}
else if (dr.HasRows!= true)
{
ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('VendorName:" + sVendorName + " not found. Inserting Vendor details into Vendor and Invoice table.')", true);
SqlCommand insertcmd = new SqlCommand("dbo.InsertVendorName", myConnection);
insertcmd.CommandType = CommandType.StoredProcedure;
insertcmd.Parameters.Add(new SqlParameter("@VendorName", SqlDbType.VarChar));
insertcmd.Parameters["@VendorName"].Value = sVendorName;
sVendorDetails = new VendorDetails();
sVendorDetails.VendorID = insertcmd.ExecuteNonQuery();
sVendorDetails.VendorName = sVendorName;
}
dr.Close();
return sVendorDetails;
}
catch (SqlException err)
{
throw new ApplicationException("DB usp_GetVendorByVendorName Error: " + err.Message);
}
finally
{
myConnection.Close();
}
}
【问题讨论】:
-
这就是为什么您应该始终使用
using语句的原因。 -
if (dr.HasRows) { } else if (dr.HasRows!= true) { }第二个 if 块没有意义。if (dr.HasRows) { } else { }做同样的事情。 -
将连接存储在一个字段中是不好的(如果它是我们不知道的静态连接则更是如此)。而是在您需要的地方创建、打开、使用和关闭连接。最好使用
using-statement。 -
你不能有行,但你仍然打开了 DataReader。进入 Not HasRow if 块时需要关闭它。顺便说一句,将 MultipleActiveResultSets=True; 添加到您的连接字符串将允许在 DataReader 打开时使用连接
标签: c#