将数据库值分配给变量

时间:2017-12-01 16:22:56

标签: c# sql asp.net database variables

我正在使用数据库进行作业,我正在检查是否有任何过期的电影。我想知道是否有可能从数据库表中获取值并将其分配给字符串变量。这是我的代码

<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变量,但我正在测试哪个可以工作。

3 个答案:

答案 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,但是你没有指定你的网格是否是数据绑定。