我有一个表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
我该如何解决?谢谢。
答案 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+" ";