我正在使用数据库进行作业,我正在检查是否有任何过期的电影。我想知道是否有可能从数据库表中获取值并将其分配给字符串变量。这是我的代码
<asp:Panel runat="server" ID="CheckoutPanel" Visible="false">
<h4>Movies that are Checked Out</h4>
<asp:GridView id="one_data2" AutoGenerateColumns="false" runat="server">
<Columns>
<asp:BoundField DataField="MovieID"
HeaderText="Movie ID"/>
<asp:BoundField DataField="SubscriberID"
HeaderText="Checked Out On"/>
<asp:BoundField DataField="DueDate"
HeaderText="Due On" />
</Columns>
</asp:GridView>
</asp:Panel>
以上是我想从中获取信息的面板。 下面是我制作的代码但不太有效。
protected void DueMovies(Object src, EventArgs e)
{
get_connection();
connection.Open();
command = new SqlCommand("SELECT * FROM checkout", connection);
reader = command.ExecuteReader();
int movieId = one_data2.Rows["0"]["MovieID"].ToString();
string subId = one_data2.Rows["1"]["SubscriberID"].ToString();
string dueDate = one_data2.Rows["2"]["DueDate"].ToString();
DateTime lateDate = Convert.ToDateTime(one_data2.Rows["2"]["DueDate"]);
if(DateTime.Now >= lateDate)
{
string EmailMsg = "A late message has been sent to " + subId;
}
else
{
lblInfo.Text = "No movies are due soon";
}
}
变量不起作用,因为我收到错误,说我无法从int转换为字符串。我试图设置为int,但这不起作用。有两个duedate变量,但我正在测试哪个可以工作。
答案 0 :(得分:2)
您的代码示例不完整,但我试图查看代码中使用Int to String转换的位置。 Visual Studio应该告诉您错误的确切行。 我怀疑错误是在线:
int movieId = one_data2.Rows["0"]["MovieID"].ToString();
您无法在数据阅读器中引用行 - 您必须打开数据阅读器并开始通过它们进行迭代并访问每行列。
我建议使用Linq to SQL或Entity Framework将记录列表放入带有计算列的匿名类中:
var movies = (from m in ctx.checkouts
select new
{
MovieID = m.MovieID,
SubscriberID = m.SubscriberID,
DueDate = m.DueDate,
// Computed Column is line below
IsOverDue = (m.DueDate > DateTime.Now) ? "NO" : "YES"
}).ToList();
然后,您可以在网格中添加一个额外的列,并将电影列表绑定到网格。这是显示计算列的新列:
<asp:BoundField DataField="IsOverDue" HeaderText="IsOverDue" />
答案 1 :(得分:1)
尝试沿着这条线 - 提供自己的方法来创建连接。
static void Main(string[] args)
{
string someText;
using (var connection = new SqlConnection("..."))
{
// autodisposing if no longer needed
using (var command = new SqlCommand("SELECT * FROM checkout"))
{
var msg = new List<string>(); // collects msg to avoid several updates to label
// autodisposing ifnolonger needed
using (var reader = command.ExecuteReader())
{
if (reader.HasRows)
{
// if rows present, read one by one until done
while(reader.NextResult())
{
// process one row
var movieId = Convert.ToInt32(reader["MovieId"]);
var subId = Convert.ToInt32(reader["SubscriberID"]);
var dueDate = Convert.ToDateTime(reader["DueDate"]);
// check due
if (DateTime.Now > dueDate)
msg.Add(SendLateMail(subId)); // send mail and store message
}
// make label text by joining all msg with newlines
someText = string.Join("\n", msg);
}
else
{
// no rows found, set label text
someText = "No movies due.";
}
// TODO: set your labels .Text
}
}
}
}
static string SendLateMail(int subId)
{
// Todo: send mail
// create text to accumulate for label
return $"Due Email send to {subId}";
}
答案 2 :(得分:0)
据我所知,在查看了您使用ASP.Net Web Forms的HTML和代码之后,对吗?如果是这种情况,那么您应该尝试将gridview中单元格的内容解析为变量的数据类型。
GridViewRow有一个TableCells集合,可以通过Cells属性加入。引用一个行的方法是GridView为one_data2.Rows["0"]
,并且可以为您的变量赋值:
int movieId;
int.tryParse(one_data2.Rows["0"].Cells["MovieID"].Text, out movieId);
string subId = one_data2.Rows["0"]["SubscriberID"].Text;
string dueDate = one_data2.Rows["0"]["DueDate"].Text;
string yourStringFormat ="yyyy-MM-dd" // or whatever format your GridView has
DateTime lateDate;
DateTime.TryParseExact(yourStringFormat, pattern, null, System.Globalization.DateTimeStyles.None, out lateDate);
另一种方法可能是访问行的dataItem,但是你没有指定你的网格是否是数据绑定。