【问题标题】:How to store the resulting string of a SQL query in C#如何在 C# 中存储 SQL 查询的结果字符串
【发布时间】:2018-12-21 12:10:51
【问题描述】:

我有一个表 TümEnvanter$,其中有 2 列设备代码 (Ekipman) 及其描述 (Tanım)。

用户从组合框中选择设备,我希望在他们从组合框中选择时,标签中显示所选设备的描述。

这是我尝试过的:

SqlCommand cmdTanim = new SqlCommand("select Tanım from TümEnvanter$ where Ekipman = '" + comboBox_ekipman.Text + "'", connect);
connect.Open();

SqlDataReader reader = cmdTanim.ExecuteReader();
string tanim = reader.ToString();

labelTanim.Text = "Ekipman Tanımı: "+tanim+" ";

当我使用这段代码时,我进入了标签:

Ekipman Tanımı: System.Data.SqlClient.SqlDataReader

我该如何解决这个问题?谢谢。

【问题讨论】:

  • 只需使用 'string tanim =Convert.ToString( reader["Tanım"]);'而不是 'string tanim = reader.ToString(); '
  • 重要:您的代码容易受到 SQL 注入的影响。请了解 SQL 注入,并始终使用参数,而不是字符串连接。现在,只需使用您的输入框,就可以有人完全接管您的服务器。

标签: c# sql sql-server string winforms


【解决方案1】:

使用此代码,通过使用SqlDataReaderreader() 方法来读取和访问SqlDataReader 的内容。

SqlCommand cmdTanim = new SqlCommand("select Tanım from TümEnvanter$ where Ekipman = '" + comboBox_ekipman.Text + "'", connect);
connect.Open();

SqlDataReader reader = cmdTanim.ExecuteReader();
if(reader.HasRows){
    reader.read();
    string tanim = reader.ToString();
    labelTanim.Text = "Ekipman Tanımı: "+tanim+" ";    
}

希望这段代码 sn-p 对你有用。

【讨论】:

    【解决方案2】:

    类似这样的:

    // wrap IDisposable into using
    using (SqlConnection connect = new SqlConnection("Put_Connection_String_Here"))
    {
        connect.Open();
    
        // Make SQL readable and parametrized
        string sql = 
          @"select Tanım 
              from TümEnvanter$ 
             where Ekipman = @prm_Ekipman";  
    
        // wrap IDisposable into using 
        using (SqlCommand cmdTanim = new SqlCommand(sql, connect))
        {   
            //TODO: explicit typing Add(..., DbType...) is a better choice then AddWithValue
            cmdTanim.Parameters.AddWithValue("@prm_Ekipman", comboBox_ekipman.Text);
    
            // We want one record only; ExecuteScalar() instead of ExecuteReader() 
            // String interpolation shortens the code
            labelTanim.Text = $"Ekipman Tanımı: {cmdTanim.ExecuteScalar()} ";
        }
    }
    

    【讨论】:

      【解决方案3】:

      你应该试试这段代码,它收集了一些好的做法,例如:

      1) 使用using语句释放未管理的资源(SQL连接,一般IDisposables)。

      2) 使用SqlCommand 对象的Parameters 字段防止SQL 注入。

      另外,我使用了@MarcGravell 提到的ExecuteScalar 方法,它简化了代码。

      public void SqlConn()
      {
          string tanim = null;
          using (SqlConnection connect = new SqlConnection("connectionString"))
          {
              using (SqlCommand cmdTanim = new SqlCommand())
              {
                  cmdTanim.Connection = connect;
                  cmdTanim.CommandText = "select Tanım from TümEnvanter$ where Ekipman = @param";
                  cmdTanim.Parameters.Add("@param", SqlDbType.VarChar).Value = comboBox_ekipman.Text;
                  connect.Open();
      
                  tanim = (string)cmdTanim.ExecuteScalar();
              }
          }
          labelTanim.Text = "Ekipman Tanımı: " + tanim + " ";
      }
      

      【讨论】:

        【解决方案4】:

        如果您只期望一个值,那么ExecuteScalar 比使用阅读器要简单得多,即

        labelTanim.Text = Convert.ToString(cmdTanim.ExecuteScalar());
        

        一般来说,也许可以考虑使用像“Dapper”这样的工具,即使在多行情况下也可以简化操作并且轻松解决 SQL 注入问题:

        string s = connect.QuerySingle<string>(
            "select Tanım from TümEnvanter$ where Ekipman = @val", // command
            new { val = comboBox_ekipman.Text }); // parameters
        

        【讨论】:

          【解决方案5】:

          使用下面的代码:

          SqlCommand cmdTanim = new SqlCommand("select Tanım from TümEnvanter$ where Ekipman = '" + comboBox_ekipman.Text + "'", connect);
          connect.Open();
          
          SqlDataReader reader = cmdTanim.ExecuteReader();
          string tanim = string.Empty;
          
              while (reader.Read())
              {
                  tanim=  reader["Tanım"].ToString()
              }
          
          labelTanim.Text = "Ekipman Tanımı: "+tanim+" ";
          

          【讨论】:

          • if (reader.Read()) {...} 而不是 while; labelTanim.Text = $"Ekipman Tanımı: {tanim}"; 字符串插值更具可读性。
          • 其实我只是给了他示例代码。因为他也可以得到多行。他可以根据自己的要求申请条件。
          • 这是糟糕的代码,不应鼓励;多个严重故障,包括离开 SQL 注入,以及未能处理命令或读取器。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-24
          • 1970-01-01
          相关资源
          最近更新 更多