我有以下内容:
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();
我想在执行语句后得到第二列。我知道它只返回一行有两列
我在网上看过,我必须阅读结果的每一行,还有其他方法吗?
答案 0 :(得分:8)
ExecuteScalar
从结果集的第一行获取第一列。如果您需要访问更多,您需要采取不同的方法。像这样:
DataTable dt = new DataTable();
SqlDataAdapater sda = new SqlDataAdapter(sql, conn);
sda.Fill(dt);
Program.defaultCollection = dt.Rows[0]["defaultCollection"];
现在,我意识到字段名称可能不是defaultCollection
,但您可以将其填入。
来自ExecuteScalar
的{{3}}:
执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。
现在,作为最后一点建议,请将所有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`
}
这将确保它们妥善处理。
答案 1 :(得分:2)
我想在执行语句
后得到第二列
执行标量是不可能的。
还有其他方式
这里有两个选项可以使用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();
}
答案 2 :(得分:1)
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();
}
这将是最快的方式。
答案 3 :(得分:0)
您可以使用DataReader并只读取第一列,如:
IDataReader cReader = cmd.ExecuteReader();
if(cReader.Read())
{
string cText = cReader.GetString(1); // Second Column
}
答案 4 :(得分:0)
ExecuteScalar只返回一个值。您必须确保您的查询仅返回该值。
String sql = "SELECT temp.defaultCollection FROM Temp WHERE Temp.collection = '" + Program.collection + "'";
在旁注上,请阅读SqlParameter。您不希望连接这样的值,当集合属性包含引号时,您将遇到问题。