如何在 C# 中存储 SQL 查询的结果字符串
Posted
技术标签:
【中文标题】如何在 C# 中存储 SQL 查询的结果字符串【英文标题】:How to store the resulting string of a SQL query in C# 【发布时间】:2018-12-21 12:10:51 【问题描述】:我有一个表 TümEnvanter$
,其中有 2 列设备代码 (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
我该如何解决这个问题?谢谢。
【问题讨论】:
只需使用 'string tanim =Convert.ToString( reader["Tanım"]);'而不是 'string tanim = reader.ToString(); ' 重要:您的代码容易受到 SQL 注入的影响。请了解 SQL 注入,并始终使用参数,而不是字符串连接。现在,只需使用您的输入框,就可以有人完全接管您的服务器。 【参考方案1】:使用此代码,通过使用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+" ";
希望这段代码 sn-p 对你有用。
【讨论】:
【参考方案2】:类似这样的:
// 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】:你应该试试这段代码,它收集了一些好的做法,例如:
1) 使用using
语句释放未管理的资源(SQL连接,一般IDisposable
s)。
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 + " ";
【讨论】:
【参考方案4】:如果您只期望一个值,那么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
【讨论】:
【参考方案5】:使用下面的代码:
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+" ";
【讨论】:
if (reader.Read()) ...
而不是 while
; labelTanim.Text = $"Ekipman Tanımı: tanim";
字符串插值更具可读性。
其实我只是给了他示例代码。因为他也可以得到多行。他可以根据自己的要求申请条件。
这是糟糕的代码,不应鼓励;多个严重故障,包括离开 SQL 注入,以及未能处理命令或读取器。以上是关于如何在 C# 中存储 SQL 查询的结果字符串的主要内容,如果未能解决你的问题,请参考以下文章
C# 调用一个方法,内有一个参数,执行SQL查询语句,并将结果返回,该方法如何写?