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

C# 如何在C中存储SQL查询的结果字符串,c#,sql,sql-server,string,winforms,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(); SqlDataRea

我有一张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
我怎样才能解决这个问题?谢谢。

使用以下代码:

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+" ";

如果您只需要一个值,那么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使用using语句释放非托管资源SQL连接,通常是IDisTables

2防止使用SqlCommand对象的参数字段进行SQL注入

此外,我还使用了@MarcGravel提到的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 + " ";
}
大概是这样的:

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

通过使用SqlDataReader的reader方法来读取和访问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+" ";    
}

希望这段代码对您有用。

只需使用“string tanim=Convert.ToString reader[Tanım];”而不是'string tanim=reader.ToString;'重要提示:您的代码容易受到SQL注入的影响。请了解SQL注入,并始终使用参数,而不是字符串连接。现在,只需使用您的输入框,就可以有人完全接管您的服务器;labelTanim.Text=$Ekipman Tanımı:{tanim};字符串插值更具可读性。实际上,我刚刚给了他示例代码。因为他也可以得到多行。他可以根据自己的要求申请条件。这是不好的准则,不应鼓励;多个关键故障,包括留在SQL注入中,以及未能处理命令或读取器。