我是asp.net的新手。我试图在asp.net网站上从SQL Server检索数据。这是我的SQL表格的结果,
Day_Of_Week Product_Count
-----------------------------
Sunday 8
Monday 150
Tuesday 80
Wednesday 95
Thursday 345
Friday 229
Saturday 48
这是我在c#,
中的代码 DataTable dt = new DataTable();
SqlConnection con = new SqlConnection(Settings.DatabaseConnectionString);
SqlCommand com = new SqlCommand("Select * from tblProducts");
com.CommandType = CommandType.Text;
com.Connection = con;
con.Open();
SqlDataAdapter da = new SqlDataAdapter(com);
da.Fill(dt);
int monday = Convert.ToInt32(dt.Rows[1]["Product_Count"]);
int tuesday = monday + Convert.ToInt32(dt.Rows[2]["Product_Count"]);
int wednesday = tuesday + Convert.ToInt32(dt.Rows[3]["Product_Count"]);
int thursday = wednesday + Convert.ToInt32(dt.Rows[4]["Product_Count"]) ;
int friday = thursday + Convert.ToInt32(dt.Rows[5]["Product_Count"]);
现在,如果星期日没有记录,它就不显示星期日行,我必须更改c#代码。相反,我想设置一个开关盒或其他东西,如果那天是星期一,那么我可以写dt.Rows [0],如果那天是星期二,那么dt.Rows [0]等。
让我知道这样做的最佳选择。任何帮助将不胜感激。
感谢。
答案 0 :(得分:1)
您可以使用foreach遍历行和交换机来设置数据。首先预先初始化变量。
int monday = 0;
int tuesday = 0;
// and repeat
foreach(DataRow row in dt.Rows)
{
switch(row["Days_Of_Week"].ToString().ToLower())
{
case "monday":
monday = (int)row["Product_Count"];
break;
case "tuesday":
tuesday = (int)row["Product_Count"] + monday;
break;
// repeat for each
}
}
答案 1 :(得分:1)
您需要重新考虑您的方法。因为您要做的就是按天获取产品数量,我会做这样的事情,而不是依赖于行号。
public static int FetchProductCountByDayOfWeek(DayOfWeek dayOfWeek)
{
using(SqlConnection con = new SqlConnection(Settings.DatabaseConnectionString))
{
con.Open();
SqlCommand com = new SqlCommand("Select * from tblProducts where Day_Of_Week = @day_of_week");
com.CommandType = CommandType.Text;
com.Connection = con;
com.Parameters.AddWithValue("@day_of_week", dayOfWeek.ToString());
using (SqlDataAdapter da = new SqlDataAdapter(com))
{
DataTable dt = new DataTable();
da.Fill(dt);
return Convert.ToInt32(dt.Rows[0]["Product_Count"]);
}
}
}
然后你会这样称呼它:
int monday = ProductHelper.FetchProductCountByDayOfWeek(DayOfWeek.Monday);
虽然这不像一次读取行那样有效,因为它正在进行多次数据库调用。
答案 2 :(得分:0)
使用查询检索所需数据可能更好,因此您无需在C#中对其进行操作。
您可以使用T-SQL语句来检测给定日期内何时没有行。不是您想要的确切查询,但基本上您可以使用ISNULL
来检测没有行的情况,例如没有计数的天数。
SELECT ISNULL(
(SELECT 1 FROM tblProducts T
WHERE T.Day_Of_Week = @DayName and T. Product_Count > 0), 0)
答案 3 :(得分:0)
假设您要更改查询以使用PIVOT SQL Statement
string query = @"
SELECT 'Day Production' As DayProduction, Sunday, Monday, Tuesday, Wednesday,
Thursday, Friday, Saturday
FROM (SELECT Day_Of_Week, ProductCount FROM tblProducts) as tbp
PIVOT
(
SUM(ProductCount)
FOR Day_Of_Week IN ( Sunday, Monday, Tuesday,Wednesday,Thursday,Friday,Saturday )
) AS Totals";
现在您的代码可以重写为
using(SqlConnection con = new SqlConnection(Settings.DatabaseConnectionString))
using(SqlCommand cmd = new SqlCommand(query, con))
{
con.Open();
// The query will return just one row with eight columns
using(SqlDataReader reader = cmd.ExecuteReader())
{
if(reader.Read())
{
// The column at ordinal 0 is the DayProduction one....
// Check if column at ordinal 1 (Sunday) contains a DBNull.Value or not...
int sunday = reader.IsDBNull(1) ? 0 : Convert.ToInt32(reader[1]);
int monday = reader.IsDBNull(2) ? 0 : Convert.ToInt32(reader[2]);
int tuesday = reader.IsDBNull(3) ? 0 : Convert.ToInt32(reader[3]);
int wednesday = reader.IsDBNull(4) ? 0 : Convert.ToInt32(reader[4]);
int thursday = reader.IsDBNull(5) ? 0 : Convert.ToInt32(reader[5]);
int friday = reader.IsDBNull(6) ? 0 : Convert.ToInt32(reader[6]);
int saturday = reader.IsDBNull(7) ? 0 : Convert.ToInt32(reader[7]);
}
}
}
您先前查询的行将作为列旋转,而星期日(或任何其他日期)如果不存在则始终作为DBNull.Value返回。