【问题标题】:Not able to return gridview with values无法返回带有值的gridview
【发布时间】:2021-07-01 22:08:24
【问题描述】:

我正在尝试动态返回一个搜索框,该搜索框将使用参数化的 addwithvalue 函数根据 SQL 之类的函数在表中给出产品名称。

我的 aspx 设计文件如下所示:

我在 aspx.cs 代码后面的代码是这样的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;

namespace KUD4
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {

            string ConnectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
            using (SqlConnection connection = new SqlConnection(ConnectionString))
            {

                SqlCommand cmd = new SqlCommand("Select * from dbo.tblProductInventory where ProductName like @ProductName", connection);
                cmd.Parameters.AddWithValue("@ProductName", TextBox1.Text + "%");
                connection.Open();
                GridView1.DataSource = cmd.ExecuteReader();
                GridView1.DataBind();
            }

        }
    }
}

当我尝试在搜索字段中输入任何文本并单击“获取产品”按钮时。网格视图没有到达。

我做错了什么?

我的桌子是这样的:

id  ProductName QuantityAvailable
101 iPhone  101
102 Apple Laptops   100
103 Books   120
104 Acer Laptops    119
105 iPads   134

【问题讨论】:

  • ExecuteReader 返回SqlDataReader,它不支持IListIListSourceIBindingListIBindingListView 作为DataSource 属性要求者。
  • 代码中的解决方案是什么
  • 它在没有参数化之前一直在工作我认为问题在于参数化代码而不是gridview
  • AddWithValue 通过提供的值自动检测类型时,另一个问题可能是类型不匹配。假设列类型为Nvarchar,而自动检测类型为Varchar。为匹配 db 列类型的参数提供显式类型。
  • 它的varchar在表中你会怎么改请举个例子让我试试

标签: c# sql asp.net webforms


【解决方案1】:

你所拥有的看起来相当不错。但是,在参数中强制使用数据类型可能是个好主意。

因此我建议你试试这个:

cmd.Parameters.Add("@ProductName", SqlDbType.NVarChar).Value = TextBox1.Text + "%";

如果您使用带有 3 个值的“add”,编译器会报错——但已弃用。但是具有两个值的 .Add() - 强数据类型,并按照上面的方式使用 .Value 并没有被弃用,实际上是一个好方法。

很好的是,如果您没有在该文本框中输入任何内容并点击搜索按钮,它应该会显示所有行。

此外,使用 .ExecuteReader 将 + 推入网格中也没问题。

但是,请记住,如果您有数据寻呼机,则必须添加以下内容:

DataTable rstData = new DataTable();
rstData.Load(cmd.ExecuteReader);
GridView1.DataSource = rstData;
GridView1.DataBind();

但是,如果没有数据分页器 - 你所拥有的一切都很好,应该可以工作。

还有一个仅供参考:

你做得很好 - 因为 sql cmd 对象有一个数据读取器 - 你不需要一个单独的读取器,正如许多示例所示 - 你避免了 - 对你有好处!

但是,sql命令对象也有连接对象!!!所以,你也不需要单独的一个!当然,sql cmd 对象也有一个参数对象——不需要单独的一个!

没什么大不了的,但结果是你可以这样做:

string ConnectionString = ConfigurationManager.ConnectionStrings("DBCS").ConnectionString;

using (SqlCommand cmd = new SqlCommand("Select * from dbo.tblProductInventory where ProductName like @ProductName", 
     new SqlConnection(ConnectionString)))
{
    cmd.Parameters.Add("@ProductName", SqlDbType.NVarChar).Value = TextBox1.Text + "%";
    cmd.Connection.Open();

    GridView1.DataSource = cmd.ExecuteReader();
    GridView1.DataBind();
}

所以 sql 命令对象在一个很棒的小对象中包含了您需要的所有 3 件事。这也意味着您可以将其传递给其他例程等,或者只是温暖地睡觉并高兴地因为这个对象实际上拥有您需要的所有 3 件事。一个阅读器,一个命令,一个连接对象,还有参数(嗯,就是四样东西!)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多