WCF服务保持返回false

时间:2014-10-22 07:32:26

标签: c# sql database wcf ado.net

所以我在C#中创建并调用了一个WCF服务,但是不断回复,我不确定它为什么会这样。它可能与连接字符串有关,但从当前更改它只会给我带来错误。

这是我的代码:

 //Create the new connection
  SqlConnection myConnection = new SqlConnection();

 //Create the query
 String myQuery = "INSERT INTO Player  (registrationID,  firstName,  lastName,  phoneNumber,  Address,  dateOfBirth) " +
                   " VALUES ('" + registrationID + "', '" + firstName + "', '" + lastName + "', '" + phoneNumber + "', '" + Address + "', '" + dateOfBirth + "');";

  //The connectionString can be found in the properties table of the database
  myConnection.ConnectionString = "Data Source=C:/Users/User/Documents/Visual Studio 2012/Projects/ADO_LINQ/ADO_LINQ/App_Data/MyDatabase.sdf";

  //Initialuze the command
  SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
  SqlDataReader myReader;

  //Run the command
  try 
  {
          myConnection.Open();
          myReader = myCommand.ExecuteReader();
          //Return true if it was successful
          return true;
   }
   catch (Exception ex) 
   {
          return false;
   }

1 个答案:

答案 0 :(得分:0)

正如Soner所指出的,您的代码容易受到SQL注入攻击,这可以通过使用参数化查询来解决。此外,最佳做法是使用带有连接的using块,以便在using块中的代码退出后正确关闭并处理(目前您甚至没有关闭连接)当你完成了。)

此外,ExecuteNonQuery就足够了 - 它将运行命令然后返回受影响的行数(在这种情况下应为1)。除了在异常情况下使用catch块之外,您还可以检查受影响的行数并使用它来确定成功/失败。实际上,除了执行命令时抛出异常,我不会指望1 的值以外的其他内容。

最后,您发布的代码正在吞噬异常。你应该对异常做一些事情(记录它,执行一些其他代码,重新抛出它 - 取决于你的应用程序的要求)而不是简单地返回false。

全部放在一起:

using (SqlConnection myConnection = new SqlConnection())
{

    // Create the query
    String myQuery = "INSERT INTO Player  (registrationID,  firstName,  lastName,  phoneNumber,  Address,  dateOfBirth) " +
               " VALUES (@RegistrationID, @FirstName, @LastName, @PhoneNumber, @Address, @DateOfBirth)";

    //The connectionString can be found in the properties table of the database
    myConnection.ConnectionString = "Data Source=C:/Users/User/Documents/Visual Studio 2012/Projects/ADO_LINQ/ADO_LINQ/App_Data/MyDatabase.sdf";

    //Initialuze the command
    SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
    myCommand.CommandType = CommandType.Text;
    // Here you add the values for the parameters in the query
    myCommand.Parameters.Add("@RegistrationID", SqlDbType.VarChar).Value = registrationID;
    myCommand.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = firstName;
    myCommand.Parameters.Add("@LastName", SqlDbType.VarChar).Value = lastName;
    myCommand.Parameters.Add("@PhoneNumber", SqlDbType.VarChar).Value = phoneNumber;
    myCommand.Parameters.Add("@Address", SqlDbType.VarChar).Value = address;
    myCommand.Parameters.Add("@DateOfBirth", SqlDbType.VarChar).Value = dateOfBirth;

    //Run the command
    try 
    {
        myConnection.Open();
        int rowsAffected = myCommand.ExecuteNonQuery();

        if (rowsAffected == 1)
        {
            return true;
        }
        else
        {
            return false;
        }

     }
     catch (Exception ex) 
     {
         // Do something with the exception, like logging it so you can review the error 
         return false;
     }
 }

上面的代码将调用包装在using语句中。创建命令后,参数将添加到SqlCommand.Parameters集合中,然后返回ExecuteNonQuery。如果结果为1,则返回true,否则返回false。如果遇到错误,则返回false,但是您应该再次执行异常操作,以便在需要时进行故障排除。