2014-05-09 111 views
-2

下面是我的代码。我想要'int'类型的函数,它将返回'int'value.Query在这段代码中返回一个'int'值,但是在这段代码中返回值是什么?我无法在此处写回返get_number。那我会怎么做?从查询返回int值的int型函数的返回值是什么

我的代码:

public int CheckMatch(CourseSchedule courseInfo) 
    { 
     try 
     { 
      ConnectionObj.Open(); 
      string get_number = "SELECT count(c_t_id) FROM course_teacher_table WHERE room_number = '" + courseInfo.RoomNumber + "' and class_days = '" + courseInfo.Days + "' and class_time = '" + courseInfo.ClassTime + "'"; 
      CommandObj.CommandText = get_number; 
      CommandObj.ExecuteNonQuery(); 

      return '???' 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      if (ConnectionObj != null && ConnectionObj.State == ConnectionState.Open) 
      { 
       ConnectionObj.Close(); 
      } 
     } 
    } 
+3

此代码容易受到sql注入攻击。它实际上是乞求被黑客攻击。 –

+1

您应该始终使用[参数化查询](http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/)。这种字符串连接对于_SQL Injection_攻击是开放的。 –

+0

@JoelCoehoorn C#允许多个查询吗? – EaterOfCode

回答

6

相反的CommandObj.ExecuteNonQuery();,你可以这样做:

return Convert.ToInt32(CommandObj.ExecuteScalar()); 

应该只在更新使用ExecuteNonQuery()或插入语句。在返回单一结果的查询中,您可以拨打ExecuteScalar()返回object,您可以将其转换为int

在附注上。我没有看到你对参数进行了整理。不要这样做。否则,它很容易进行sql注入。

您必须改用参数化查询。

+0

感谢兄弟。其工作:) – Ikr

+0

不会'(int?)command.ExecuteScalar()'更好? – Abhitalks

+0

@abhitalks,这将抛出错误。 –

2

除了从查询中获取数字之外,该代码还有几个重要问题。以下代码纠正了其中的大部分内容:

public int CheckMatch(CourseSchedule courseInfo) 
{ 
    string get_number = 
      "SELECT count(c_t_id) " + 
      " FROM course_teacher_table" + 
      " WHERE room_number = @Room AND class_days = @Days AND class_time = @Time"; 

    //.Net works best when you create a brand new connection object for most queries 
    using (var cn As New SqlConnection("connection string here")) 
    using (var cmd As New SqlCommand(get_number, cn)) 
    { 
     //I'm guessing at sql column types here. Use the actual column types from the DB. 
     cmd.Parameters.Add("@Room", SqlDbType.NVarChar, 5).Value = courseInfo.RoomNumber; 
     cmd.Parameters.Add("@Days", SqlDbType.Int).Value = courseInfo.Days; 
     cmd.Parameters.Add("@Time", SqlDbType.NVarChar, 20).Value = courseInfo.ClassTime; 

     cn.Open(); 
     return Convert.ToInt32(cmd.ExecuteScalar()); 
    } 
}