正在从sql ExecuteScalar()中检索值
本文关键字:检索 ExecuteScalar sql | 更新日期: 2023-09-27 18:27:34
我有以下内容:
String sql = "SELECT * FROM Temp WHERE Temp.collection = '" + Program.collection + "'";
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
Program.defaultCollection = (String)cmd.ExecuteScalar();
我想在执行完该语句后得到第二列。我知道它只会返回一行两列
我在网上读到,我必须阅读每一行的结果,还有其他方法吗?
ExecuteScalar
从结果集的第一行中获取第一列。如果你需要更多的访问权限,你需要采取不同的方法。像这样:
DataTable dt = new DataTable();
SqlDataAdapater sda = new SqlDataAdapter(sql, conn);
sda.Fill(dt);
Program.defaultCollection = dt.Rows[0]["defaultCollection"];
现在,我意识到字段名称可能不是defaultCollection
,但您可以填写它。
来自ExecuteScalar
:的MSDN文档
执行查询,并返回查询返回的结果集中第一行的第一列。将忽略其他列或行。
现在,作为最后一点建议,请将所有ADO.NET对象封装在using
语句中。像这样:
using (SqlConnection conn = new SqlConnection(connString))
using (SqlDataAdapter sda = new SqlDataAdapter(sql, conn))
{
DataTable dt = new DataTable();
sda.Fill(dt);
// do something with `dt`
}
这将确保它们得到妥善处理。
我想在执行语句后得到第二列
使用execute标量是不可能的。
还有别的办法吗
这里有两个选项,可以使用SqlDataAdapter或SqlDataReader。For you using DataReader is a recommended
方法,因为您不需要离线数据或进行其他工作
通过使用SqlDataAdapter
using (SqlConnection c = new SqlConnection(
youconnectionstring))
{
c.Open();
/
using (SqlDataAdapter a = new SqlDataAdapter(sql, c))
{
DataTable t = new DataTable();
a.Fill(t);
if(t.Rows.Count > 0)
{
string text = t.Rows[0]["yourColumn"].ToString();
}
}
}
通过使用DataREader
using (SqlConnection connection =
new SqlConnection(connectionString))
{
SqlCommand command =
new SqlCommand(sql, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
//read data here
string text = reader.GetString(1)
}
reader.Close();
}
SqlCommand.ExecuteScalar()
只能在结果只有一行和列时使用。
如果你需要返回多个列,你应该使用这样的东西:
String sql = "SELECT * FROM Temp WHERE Temp.collection = '" + Program.collection + "'";
SqlConnection conn = new SqlConnection(connString);
using(SqlCommand cmd = new SqlCommand(sql, conn))
{
using(SqlDataReader rdr = cmd.ExecuteReader())
{
if(rdr.Read())
{
Program.defaultCollection = (String)rdr["Column1"];
Program.someOtherVar = (String)rdr["Column2"];
}
}
rdr.Close();
}
那将是最快的方式。
您可以使用DataReader只读取第一列,如:
IDataReader cReader = cmd.ExecuteReader();
if(cReader.Read())
{
string cText = cReader.GetString(1); // Second Column
}
ExecuteScalar只返回一个值。您必须确保您的查询只返回该值。
String sql = "SELECT temp.defaultCollection FROM Temp WHERE Temp.collection = '" + Program.collection + "'";
附带说明一下,请阅读SqlParameter。如果您不想这样连接值,那么当collection属性包含引号时就会出现问题。