2012-12-26 179 views
3

我有这个小问题。我想将select语句的结果值检索到字符串变量中。像这样select语句的返回值

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

我希望将选定的处理值放入字符串变量中。我怎样才能做到这一点。谢谢

+4

开始通过避免 “...... NonQuery” 的方法。非查询意味着“不会执行此命令返回任何值。“ – phoog

+3

使用ExecuteReader()获取数据读取器并调用数据读取器上的Read(0) – rene

回答

19

使用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。始终使用参数化查询。杰夫有一篇很酷的博客文章,名为Give me parameterized SQL, or give me death。请仔细阅读。还阅读DotNetPerl SqlParameter文章。当您正在处理查询时,SQL注入非常重要。

+0

Soner你应该推荐给OP来包装他的ExecutReader()方法,以包装try {} catch – MethodMan

+1

@DJKRAZE好主意。 –

+0

我要强调的是,这是不是在全局中的一个很好的解决方案。它回答了这个问题,但没有解决SQL注入的问题。 –

0

你只需要使用命令的ExecuteScalar方法 - 这会给你在结果集的第一行和第一列的值。

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

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

1

答案:

String res = cmd1.ExecuteScalar(); 

这句话:使用参数化查询防止SQL注入

+0

这是件好事,但你在假设OP的查询将始终返回1个记录..也是这不是如何回答OP的问题,为什么不是他与工作解决方案 – MethodMan

0

您需要使用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); 
+1

Cristoleg代码粘贴一个很好的例子,他可以做到这一点,而无需使用OleDBAdapter – MethodMan

+0

@DJKRAZE嗯...也许你是对的。 –

2

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 [email protected]"; 
    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()); 
} 
+0

Vishak,你正在发行一个cmd1.ExecuteR eader()如果返回的行数超过1行,你会怎么做?你不应该检查如果reader.HasRows或读取器。阅读()在一个While循环.. ???我们假定你是查询将只在你需要使用的ExecuteScalar() – MethodMan

+0

也看看这个链接http://msdn.microsoft.com/en-us/library/system.data.sqlclient这种情况下,返回1行。 sqldatareader.getordinal%28v = vs.71%29.aspx 你有int PatientID = reader.GetOrdinal(“treatment”); while循环在哪里阅读下一个记录,如果有..? – MethodMan

+0

谢谢您的建议.. @ DJKRAZE –

0

有很多不对您的示例代码。

  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(); 
        } 
    
+0

您的示例中的Select语句在哪里..? – MethodMan

+0

Hrm,在翻译的某处丢失了它。我已经添加了它。 –

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