【问题标题】:Problem with query string and extract values查询字符串和提取值的问题
【发布时间】:2019-06-14 07:08:21
【问题描述】:

我无法通过查询提取值并将它们插入textboxes

我哪里错了?

 Request.QueryString.Get("ID_Persona");

 string query = "SELECT ID,Nome,Cognome,Email,CodiceFiscale FROM Persona WHERE ID = @id";

 using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString))
       {         
           SqlCommand cmd = new SqlCommand(query, con);

           cmd.Parameters.AddWithValue("@ID","");
           cmd.Parameters.AddWithValue("@Nome", TextBox1.Text);
           cmd.Parameters.AddWithValue("@Cognome", TextBox15.Text);
           cmd.Parameters.AddWithValue("@Email", TextBox20.Text);
           cmd.Parameters.AddWithValue("@CodiceFiscale", TextBox22.Text);

           con.Open();

           cmd.ExecuteNonQuery();
       }

【问题讨论】:

  • 您现在遇到的行为是什么?它是否检索您想要的列?您现在只需要将值分配给文本框?
  • 我需要在这些 texboxes 中输入数据库值。我用 id 标识行
  • 你使用了ExecuteNonQuery。这不会返回任何数据。改用 ExecuteReader,或者像 Dapper 这样的 microORM 来简化代码
  • 与 ExecuteReader 不一样
  • @Elmachico,你试过我下面的例子吗?

标签: c# query-string sqlcommand


【解决方案1】:

您需要使用ExecuteReader 来读取值,如下所示:

var connectionString = ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString;
string query = "SELECT ID,Nome,Cognome,Email,CodiceFiscale FROM Persona WHERE ID = @id";
using (SqlConnection con = new SqlConnection(connectionString))
{
    using (var cmd = new SqlCommand(query, con))
    {
      cmd.Parameters.AddWithValue("@ID", Request.QueryString.Get("ID_Persona"));
      con.Open();
      using (var rdr = cmd.ExecuteReader())
      {
          if (rdr.Read())
          {
              //IDTextBox? = rdr["Id"].ToString(),
              TextBox1.Text = rdr["Nome"].ToString(),
              TextBox15.Text = rdr["Cognome"].ToString(),
              TextBox20.Text= rdr["Email"].ToString(),
              TextBox22.Text= rdr["CodiceFiscale"].ToString(),    
          }
      }
   }
}

【讨论】:

  • 你能debug 看看哪个部分不工作吗?是否抛出异常?
  • 不,它不会抛出任何异常,现在我在调试中告诉你我看到了什么
  • if (rdr.Read()) 而不是 while (rdr.Read()) 因为您只想读取一条记录
  • id 取自一个列表视图,其中有更改键,我将它传递给一个 quey 字符串
  • @JohnChris 致下一位朋友,我不会轻易忘记你的!
【解决方案2】:

您应该使用ExecuteReader() 而不是ExecuteNonQuery(),因为ExecuteNonQuery 用于DML 操作。同样,您只需要传递 ID 值,然后再将不必要的参数传递给查询。将它们全部删除。下面是一个例子

    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine(String.Format("{0}", reader["Email"]));
    }

【讨论】:

    【解决方案3】:

    我可以看到几个问题:

    1. 您应该使用ExecuteReader() 而不是ExecuteNonQuery()
    2. 您应该只提供1 参数 - @ID;我怀疑它是否应该有一个 empty 值。
    3. 您应该将IDisposable 包装成using

    代码:

       string query = 
         @"SELECT ID,
                  Nome,
                  Cognome,
                  Email,
                  CodiceFiscale 
             FROM Persona 
            WHERE ID = @id";
    
       using (SqlConnection con = new SqlConnection(...))
       {         
           con.Open();
    
           using SqlCommand cmd = new SqlCommand(query, con) 
           {
               // I doubt if you want empty Id here. 
               // I've assumed you want to pass ID_Persona
               cmd.Parameters.AddWithValue("@ID", Request.QueryString.Get("ID_Persona")); 
    
               using (var reader = cmd.ExecuteReader())
               {
                   if (reader.Read()) 
                   {
                       TextBox1.Text  = Convert.ToString(reader["Nome"]); 
                       TextBox15.Text = Convert.ToString(reader["Cognome"]); 
                       TextBox20.Text = Convert.ToString(reader["Email"]); 
                       TextBox22.Text = Convert.ToString(reader["CodiceFiscale"]);   
                   }
               }
           }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2013-05-28
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2011-08-30
      相关资源
      最近更新 更多