【问题标题】:Assign a database value to variable [closed]将数据库值分配给变量[关闭]
【发布时间】:2017-12-01 16:22:56
【问题描述】:

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

<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 但这也不起作用。有两个到期变量,但我正在测试哪一个可以工作。

【问题讨论】:

  • " 我想知道是否可以从数据库表中获取一个值并将其分配给一个字符串变量" 多么奇怪的要求 ;-)
  • 很好地调试以查看“行数据”中的内容。然后你就会明白这个信息。另外我不明白上面代码中one_data2来自哪里
  • 你的方法没有多大意义。您执行命令并检索阅读器,但您不使用它
  • 你在哪里关闭连接。什么是one_data2。为什么dueDatelateDate 一样。你为什么要访问不同行的不同列,这些行可能与不同的 ppl 在不同时间签出的不同视频有关....这太令人困惑了。
  • 这太宽泛了,因为 OP 似乎没有阅读过一个 ADO.NET 教程。 (撇开assign-string-to-int问题)

标签: c# sql asp.net database variables


【解决方案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】:

    您的代码示例不完整,但我试图查看您在代码中的哪个位置使用 Int 到 String 的转换。 Visual Studio 应该告诉您错误所在的确切行。 我怀疑错误在线:

    int movieId = one_data2.Rows["0"]["MovieID"].ToString();
    

    您无法引用数据阅读器中的行 - 您必须打开数据阅读器并开始遍历它们并访问每一行的列。

    我建议使用 Linq to SQL 或实体框架将记录列表放入具有计算列的匿名类中:

    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" />
    

    【讨论】:

      【解决方案3】:

      我了解,在查看了您正在使用 ASP.Net Web 表单的 HTML 和代码之后,对吗?如果是这种情况,那么您应该尝试将 gridview 中单元格的内容解析为变量的数据类型。 GridViewRow 有一个 TableCells 的集合,可以通过 Cells 属性进行访问。引用 one 行的方法是您的 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,但您没有指定您的网格是否是数据绑定的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        • 2014-04-26
        • 2020-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多