2014-05-09 109 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()); 
    } 
}