如何在 C# 中存储 SQL 查询的结果字符串

Posted

技术标签:

【中文标题】如何在 C# 中存储 SQL 查询的结果字符串【英文标题】:How to store the resulting string of a SQL query in C# 【发布时间】: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 注入,并始终使用参数,而不是字符串连接。现在,只需使用您的输入框,就可以有人完全接管您的服务器。 【参考方案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 注入,以及未能处理命令或读取器。

以上是关于如何在 C# 中存储 SQL 查询的结果字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中创建动态参数化 SQL 查询字符串

C# 调用一个方法,内有一个参数,执行SQL查询语句,并将结果返回,该方法如何写?

如何在 C# Asp.net 中将 SELECT sql 查询结果保存在数组中

如何在 C# 中有效地从 SQL 数据读取器写入文件?

如何从 C# 中的 SQL 查询结果填充类?

如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?