2

我有以下内容:

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();

我想在执行语句后得到第二列。我知道它只会返回一行两列

我已经在网上阅读了我必须阅读结果的每一行,还有其他方法吗?

4

5 回答 5

9

ExecuteScalar从结果集的第一行获取第一列。如果您需要访问更多内容,则需要采取不同的方法。像这样:

DataTable dt = new DataTable();
SqlDataAdapater sda = new SqlDataAdapter(sql, conn);
sda.Fill(dt);

Program.defaultCollection = dt.Rows[0]["defaultCollection"];

现在,我意识到字段名称可能不是defaultCollection,但您可以填写。

来自MSDNExecuteScalar文档:

执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。

现在,作为最后一点建议,请将所有 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`
}

这将确保它们得到妥善处理。

于 2013-08-13T14:36:57.777 回答
2

我想在执行语句后得到第二列

执行标量是不可能的。

有没有其他方法

您有 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();
    }
于 2013-08-13T14:38:30.657 回答
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();
}

那将是最快的方式。

于 2013-08-13T14:39:44.400 回答
0

您可以使用 DataReader 并仅读取第一列,例如:

IDataReader cReader = cmd.ExecuteReader();

if(cReader.Read())
{
    string cText = cReader.GetString(1); // Second Column
}
于 2013-08-13T14:38:40.767 回答
0

ExecuteScalar 只返回一个值。您必须确保您的查询仅返回该值。

String sql = "SELECT temp.defaultCollection FROM Temp WHERE Temp.collection  = '" + Program.collection + "'";

在旁注中,请阅读SqlParameter。你不想像这样连接值,当集合属性包含引号时你会遇到问题。

于 2013-08-13T14:40:30.423 回答