【问题标题】:Executing a data command query through ASP.NET通过 ASP.NET 执行数据命令查询
【发布时间】:2014-02-27 06:37:30
【问题描述】:

我正在尝试对本地数据库执行数据命令查询,但认为我可能混淆或遗漏了一些语法...我一直在尝试遵循 MSDN 的教程,但它们的代码部分是展示对我来说没有太大意义。我已经打开了与数据库的连接,但我不知道如何从用户输入文本框中传递参数并使用带有该参数的 select 语句,该参数还使用 LIKE 语句返回结果集,然后我可以循环通过匹配的记录。 1)点击我的搜索按钮后,它说我有一个无效的对象名称'name',这是一个问题。 2) 你能否也看看我的代码,如果我要尝试执行这个带参数的选择语句并返回错误的结果集,请告诉我?

这是我目前所拥有的

 System.Data.SqlClient.SqlDataReader dReader;

    protected void  btnFirst_Click(object sender, EventArgs e)
 {
     using (var conn = new System.Data.SqlClient.SqlConnection(@"Server=LOCALHOST;           Database=Student;Trusted_Connection=True;"))
{
    try
    {
        conn.Open();
    }
    catch (Exception ex)
    {
        lblSearch.Text = "connection problem!";
    }
    using (var Sqlcmd = new System.Data.SqlClient.SqlCommand("Delete From Name", conn))
    {
        cmd.ExecuteNonQuery();
    }

    using (var Sqlcmd = new System.Data.SqlClient.SqlCommand("SELECT Name, Address from Student where Name LIKE '%@Name%'", conn))
    {
        cmd.Parameters["@Name"].Value = txtSearch.Text; 
    }
    lblFirst.Text = "@Name";

    String s = "";
    while (dReader.Read())
    {
        s+= dReader["@Name"].ToString();
    }
    txtSearch.Text = s;
    dReader.Close();


}
}

【问题讨论】:

    标签: c# sql database-connection resultset


    【解决方案1】:

    没有执行命令,你在哪里初始化读取器? SqlCommand 周围的使用关闭得太早了。你错过了一些代码吗?

    然后我会删除 LIKE 子句后的通配符并将它们添加到参数值中。
    最后,SqlDataReader 作用于列名而不作用于参数。
    所以你需要用它的真实名称来处理所需的列

    using (var Sqlcmd = new SqlCommand("SELECT Name, Address from Student " + 
                                       "where Name LIKE @Name", conn))
    {
        cmd.Parameters.AddWithValue("@Name", "%" + txtSearch.Text "%");  
        using(SqlDataReader dReader = cmd.ExecuteReader())
        {
            StringBuilder s = new StringBuilder(1024);
            while (dReader.Read())
            {
                s.Append(dReader["Name"].ToString());
            }
            txtSearch.Text = s.ToString();
        }
     }
    

    如果您返回大量记录,我建议使用 StringBuilder 而不是字符串,以避免在每个循环中创建字符串 s 的新副本

    我建议更改的另一点是连接打开时的 try/catch。如果您不指出问题所在,您将很难解决问题。如果不想,此时搭建一个日志基础设施,至少在标签中报异常信息

    好的,如果我很无聊,很抱歉,但是还有一段代码不清楚:

    using (var Sqlcmd = new System.Data.SqlClient.SqlCommand("Delete From Name", conn))
    {
        cmd.ExecuteNonQuery();
    }
    

    此代码从名为 Name 的表中删除 EVERYTHING,考虑到上下文,这似乎是错误的。

    编辑在下面发表您的评论

    using(SqlDataReader dReader = cmd.ExecuteReader())
    {
         // First item displayed on the textbox
         if(dReader.HasRows)
              txtSearch.Text = dReader["Name"].ToString();
    
         // Continue looping on every record and copy the name field in a list
         List<string> names = new List<string>()
         while (dReader.Read())
         {
              names.Add(dReader["Name"].ToString());
         }
    
         // Here you have you list of names in memory to be used where you need it
    }
    

    【讨论】:

    • 太棒了!该代码有点工作。你是对的,我想我不需要 cmd.ExecuteNonQuery ....我关于你的代码的问题是,当我当前运行它时,它会一次获取所有匹配的记录,我怎么能只显示起始匹配记录,然后循环显示剩余匹配记录?
    • 在 ExecuteReader 之后检查 HasRows 是否为真。如果 true 调用 Read 将阅读器定位在第一条记录上,则提取 Name 值并放在标签或文本框上。然后像以前一样执行循环并将其余数据保存在您喜欢的任何位置。
    • 我的 Name 值有问题,我已经更改了表的名称并添加了更多列……我有点迷失在自己的代码中。 .. "dReader["Name"].ToString(); 下的 Name 值是一个表吗?一个列?我的 select 语句现在是一个 join 语句,所以我引用的表是 dbo.Person 和名字字段是 dbo.Person.FirstName ..我在第一个 dReader["Name"].ToString(); 行上得到一个索引超出范围异常,我尝试过使用 Name, @Name, FirstName, dbo.Person.FirstName 但它们都给了我错误
    • 也许您可以发布一个新问题,详细说明新情况和您遇到的错误(在 dReader["Name"] "name" 指的是当前记录的列)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2023-04-05
    • 2015-12-25
    • 1970-01-01
    相关资源
    最近更新 更多