C# 如何在C中存储SQL查询的结果字符串
我有一张TümEnvanter$表,其中有两列设备代码Ekipman及其描述Tanım 用户从组合框中选择设备,我希望所选设备的描述在他们从组合框中选择时显示在标签中 以下是我尝试过的: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
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注入中,以及未能处理命令或读取器。