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

4

我有一张表格TümEnvanter$,其中有两列:设备代码(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

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

2
请使用以下代码替换 'string tanim = reader.ToString();':'string tanim = Convert.ToString(reader["Tanım"]);' - Vindhyachal Kumar
4
重要提示:你的代码容易受到 SQL 注入攻击。请务必了解 SQL 注入攻击,始终使用参数而非字符串拼接。如果现在有人利用你的输入框,完全可以接管你的服务器。 - Marc Gravell
5个回答

5
如果你只期望一个单一的值,那么使用ExecuteScalar比使用reader更简单。
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

3
你应该尝试这段代码,它采用了一些好的实践方法,如:
1) 使用using语句释放未托管资源(SQL连接,一般的IDisposable)。
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 + " ";
}

3

类似这样的内容:

// 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()} ";
    }
}

0
使用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+" ";    
}

希望这段代码片段对你有用。

-1
请使用以下代码:
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+" ";

如果使用 while,则代码应改为 if (reader.Read()) {...};使用字符串插值更易读,代码应改为 labelTanim.Text = $"Ekipman Tanımı: {tanim}"; - Dmitry Bychenko
实际上,我只是给了他示例代码。因为他也可以获取多行数据。他可以根据自己的需求应用条件。 - Deepak Kumar
3
这是糟糕的代码,不应该得到鼓励;存在多个关键性失误,包括注入 SQL 以及未能正确处理命令或读取器。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接