【问题标题】:Return value of a select statement选择语句的返回值
【发布时间】:2012-12-12 01:14:14
【问题描述】:

我想将 select 语句的结果值检索到字符串变量中。像这样:

OleDbCommand cmd1 = new OleDbCommand();
cmd1.Connection = GetConnection();
cmd1.CommandText = "SELECT treatment FROM appointment WHERE patientid = " + text;
cmd1.ExecuteNonQuery();
        

我想将选定的治疗值放入一个字符串变量中。我该怎么做?

【问题讨论】:

  • 首先避免使用“...NonQuery”方法。非查询意味着“执行此命令不返回任何值。”
  • 使用 ExecuteReader() 获取数据读取器并在数据读取器上调用 Read(0)

标签: c# .net ms-access select oledb


【解决方案1】:

使用ExecuteReader() 而不是ExecuteNonQuery()ExecuteNonQuery() 仅返回受影响的行数。

try
{
    SqlDataReader dr = cmd1.ExecuteReader();
}
catch (SqlException oError)
{

}
while(dr.Read())
{
    string treatment = dr[0].ToString();
}

或者更好的是,使用using statement

using(SqlDataReader dr = cmd1.ExecuteReader())
{
    while(dr.Read())
    {
        string treatment = dr[0].ToString();
    }
}

但是如果你的SqlCommand 只返回1 列,你可以使用ExecuteScalar() 方法。它返回第一行的第一列如下:-

cmd.CommandText = "SELECT treatment FROM appointment WHERE patientid = " + text;
string str = Convert.ToString(cmd.ExecuteScalar());

您也可以将代码打开至SQL Injection。始终使用参数化查询。 Jeff 有一篇很酷的博客文章,名为 Give me parameterized SQL, or give me death。请仔细阅读。另请阅读DotNetPerl SqlParameter 文章。 SQL 注入在您处理查询时非常重要。

【讨论】:

  • Soner 你应该向 OP 推荐将他的 ExecutReader() 方法包装在一个 try{}catch
  • @DJKRAZE 好主意。已更新。
  • 我要强调的是,从整体上看,这不是一个好的解决方案。它回答了问题,但没有解决 sql 注入问题。
【解决方案2】:
SqlConnection dbConnect = new SqlConnection("your SQL connection string");    
string name = " 'ProjectName' ";
string strPrj = "Select e.type, (e.surname +' '+ e.name) as fulln from dbo.tblEmployees e where id_prj = " + name;
        SqlCommand sqlcmd = new SqlCommand(strPrj, dbConnect);
        SqlDataAdapter sda = new SqlDataAdapter(strPrj, dbConnect);
        ds = new DataSet();
        sda.Fill(ds);
        dbConnect.Open();
        sqlcmd.ExecuteNonQuery();
        dbConnect.Close();

【讨论】:

    【解决方案3】:

    Execute Scalar: Getting Single Value from the Database 方法从数据库中检索单个值(例如,聚合值)。

    cmd1.Connection = GetConnection();
    cmd1.CommandText = "SELECT treatment FROM appointment WHERE patientid = " + text;
    if(cmd.ExecuteScalar()==null)
    {
        var treatment = cmd.ExecuteScalar();
    }
    

    其他方式:ExecuteReader()

    try
    {
        cmd1.CommandText ="SELECT treatment FROM appointment WHERE patientid=@patientID";
        cmd1.Parameters.AddWithValue("@patientID", this.DropDownList1.SelectedValue);
    
        conn.Open();
        SqlDataReader dr = cmd1.ExecuteReader();
        while (dr.Read())
        {
            int PatientID = int.Parse(dr["treatment"]);
        }
        reader.Close();
        ((IDisposable)reader).Dispose();//always good idea to do proper cleanup
    }
    catch (Exception exc)
    {
        Response.Write(exc.ToString());
    }
    

    【讨论】:

    • Vishak,您正在发出 cmd1.ExecuteReader() 如果返回的行超过 1 行,您会怎么做..?你不应该检查 reader.HasRows 还是在 While 循环中执行 reader.Read() ..???您假设查询只会返回 1 行,在这种情况下您需要使用 ExecuteScalar()
    • 也看看这个链接msdn.microsoft.com/en-us/library/…你有 int PatientID= reader.GetOrdinal("treatment");如果有的话,读取下一条记录的 while 循环在哪里?
    • 你是如何传回 int PatientID = int.Parse(dr["treatment"]);它在 Try 之外是不可访问的,PatiendID 是一个应该在不同范围内声明的变量..?
    • +1 以获得干净的代码.. 但我会问 OP 他计划如何返回 PatientID,如果我们正在谈论,您可能希望将其声明为 Session["PatientID"] 或受保护的属性关于 Web 应用程序或属性 .. 我不想假设,但我猜这是一个 Windows 应用程序
    【解决方案4】:

    您的示例代码有很多错误。

    1. 您拥有内联 sql,这在很大程度上使您可以进行 sql 注入。
    2. 您正在使用 ExecuteNonQuery(),这意味着您没有得到任何数据。

       string sSQL = "SELECT treatment FROM appointment WHERE patientid = @patientId";
       OleDbCommand cmd1 = new OleDbCommand(sSQL, GetConnection()); // This may be slight different based on what `GetConnectionReturns`, just put the connection string in the second parameter.
      
      
          cmd1.Parameters.AddWithValue("@patientId", text);
          SqlDataReader reader = cmd1.ExecuteReader();
          string returnValue;
          while(reader.Read())
          {
             returnValue = reader[0].ToString();
          }
      

    【讨论】:

    • 您的示例中的 Select 语句在哪里......?
    • Hrm,在某处翻译时丢失了。我已经添加了。
    【解决方案5】:

    您需要使用 OleDbAdapter。

    string connection = "your connection";
    string query = "SELECT treatment FROM appointment WHERE patientid = " + text;
    OleDbConnection conn = new OleDbConnection(connection);
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    adapter.SelectCommand = new OleDbCommand(query, conn);
    adapter.Fill(dataset);
    

    【讨论】:

    • Cristoleg,他可以不使用 OleDBAdapter 来做到这一点
    【解决方案6】:

    答案:

    String res = cmd1.ExecuteScalar();
    

    备注:使用参数化查询防止sql注入

    【讨论】:

    • 这很好,但您假设 OP 的查询将始终返回 1 条记录。这也不是如何回答 OP 的问题的一个很好的例子,为什么不用工作解决方案粘贴他的代码
    【解决方案7】:

    您只需要使用命令的 ExecuteScalar 方法 - 这将为您提供结果集第一行和第一列的值。

    OleDbCommand cmd1 = new OleDbCommand();
    cmd1.Connection = GetConnection();
    cmd1.CommandText = "SELECT treatment FROM appointment WHERE patientid = " + text;
    var result = cmd1.ExecuteScalar();
    

    如果您的 SQL 语句返回多于一行/一列,那么您可以使用 ExecuteReader()。

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多