gpt4 book ai didi

c# - Sql DataReader 有行但返回空数据

转载 作者:行者123 更新时间:2023-12-05 09:18:25 27 4
gpt4 key购买 nike

我正在使用查询从 sql 数据库中选择数据。它有行,但数据 raader.Read() 函数返回 false 并且行为空,因为我在调试中检查过

Image Of Debugging

我一直在使用的代码是

public void getSale()
{
DB db = new DB();

try
{
db.cmd.CommandText = "select * from Sale where date is not null and (date between '"+StartDate+"' and '"+EndDate+"') order by date";
db.cmd.Connection = db.con;
db.con.Open();

if(db.con.State == System.Data.ConnectionState.Open)
{
db.dataReader = db.cmd.ExecuteReader();

if(db.dataReader.HasRows)
{
while(db.dataReader.Read())
{
SaleModel sm = new SaleModel();
sm.SaleId = long.Parse(db.dataReader["Id"].ToString());
sm.UserName = db.dataReader["UserName"].ToString();
sm.ItemsQuantity = int.Parse(db.dataReader["ItemsQuantity"].ToString());
sm.TotalAmount = double.Parse(db.dataReader["TotalAmount"].ToString());
sm.SubTotal = double.Parse(db.dataReader["SubTotal"].ToString());
sm.Discount = double.Parse(db.dataReader["Discount"].ToString());
sm.Completed = bool.Parse(db.dataReader["Completed"].ToString());
sm.Date = DateTime.Parse(db.dataReader["Date"].ToString());
sm.CustomerPhone = long.Parse(db.dataReader["CustomerPhone"].ToString());

SalesList.Add(sm);
}

db.con.Close();
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Exception", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
}
}

当我在 Visual Studio 中的查询编辑器上测试此查询时,返回了行 enter image description here

谁能帮忙?

最佳答案

为什么要连接字符串来构建 sql 查询?永远不要那样做。它是 sql 注入(inject)的来源,可能会导致这样的问题。而是使用参数化查询。

也不要使用 SqlConnection像你的 wrapper DB类(class)。这可能导致 several other issues .相反,最好使用 using 在您需要的地方创建、打开、关闭和处置它们。 -声明。连接池将为您管理其余部分。

public List<SaleModel> GetSale(DateTime startDate, DateTime endDate)
{
string sql = @"select * from Sale
where date is not null
and date between @StartDate and @EndDate
order by date";

var salesList = new List<SaleModel>();

try
{
using (var con = new SqlConnection("insert your connection string"))
using (var cmd = new SqlCommand(sql, con))
{
cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = startDate;
cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = endDate;
con.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
SaleModel sm = new SaleModel();
sm.SaleId = long.Parse(reader["Id"].ToString());
sm.UserName = reader["UserName"].ToString();
sm.ItemsQuantity = int.Parse(reader["ItemsQuantity"].ToString());
sm.TotalAmount = double.Parse(reader["TotalAmount"].ToString());
sm.SubTotal = double.Parse(reader["SubTotal"].ToString());
sm.Discount = double.Parse(reader["Discount"].ToString());
sm.Completed = bool.Parse(reader["Completed"].ToString());
sm.Date = DateTime.Parse(reader["Date"].ToString());
sm.CustomerPhone = long.Parse(reader["CustomerPhone"].ToString());

salesList.Add(sm);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exception", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
}

return salesList;
}

我很确定这行得通(例如,可能是本地化问题)。

旁注:一种方法 GetSale应该返回 List<SaleModel>但不填一个。您还应该将参数作为 DateTime 传递到方法。我已经在我的代码示例中更改了它。

关于c# - Sql DataReader 有行但返回空数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44547018/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com