如何在C#

时间:2018-07-13 07:12:39

标签: c# sql sql-server string winforms

我有一个表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

我该如何解决?谢谢。

5 个答案:

答案 0 :(得分:5)

如果只期望一个值,那么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

答案 1 :(得分:3)

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

1)使用using语句释放未损坏的资源(SQL连接,通常为IDisposable s)。

2)禁止使用Parameters对象的SqlCommand字段进行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 + " ";
}

答案 2 :(得分: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()} ";
    }
}

答案 3 :(得分:0)

使用此代码,而不是使用reader()的{​​{1}}方法来读取和访问SqlDataReader的内容。

SqlDataReader

希望此代码段对您有用。

答案 4 :(得分:-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+" ";